添加链接
注册
登录
link管理
链接快照平台
输入网页链接,自动生成快照
标签化管理网页链接
相关文章推荐
乐观的小刀
·
第89届奥斯卡奖提名揭晓 ...
·
1 月前
·
风流的匕首
·
牢牢把握新时代做好经济工作的规律性认识(推动 ...
·
2 月前
·
旅行中的红茶
·
探索赋能产业链发展新路径
·
2 月前
·
坚强的领带
·
“二次元”文化,从小众走向大众-新华网
·
4 月前
·
骑白马的金针菇
·
tabular + table ...
·
11 月前
·
link管理
›
API Reference: ApolloServer - Apollo GraphQL Docs
https://www.apollographql.com/docs/apollo-server/api/apollo-server
眼睛小的盒饭
9 月前
</noscript><div id="___gatsby"><style data-emotion="css-global 1lvuj8x">:host,:root,[data-theme]{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black-100:#13222A;--chakra-colors-black-200:#0D171C;--chakra-colors-black-300:#020404;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#CFD7D6;--chakra-colors-gray-200:#B4C0BE;--chakra-colors-gray-300:#98A9A7;--chakra-colors-gray-400:#7C928F;--chakra-colors-gray-500:#546461;--chakra-colors-gray-600:#384341;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FFF5F5;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#DB4D48;--chakra-colors-red-400:#D63530;--chakra-colors-red-500:#822727;--chakra-colors-red-600:#4D282C;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FFEEE6;--chakra-colors-orange-200:#FEBA99;--chakra-colors-orange-300:#FD864D;--chakra-colors-orange-400:#FC5200;--chakra-colors-orange-500:#B03900;--chakra-colors-orange-600:#652100;--chakra-colors-orange-700:#59301D;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FFFBE5;--chakra-colors-yellow-200:#FFE97D;--chakra-colors-yellow-300:#FAD000;--chakra-colors-yellow-400:#AF9200;--chakra-colors-yellow-500:#7D6800;--chakra-colors-yellow-600:#283022;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#F0FFF4;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#00FAB3;--chakra-colors-green-400:#25855A;--chakra-colors-green-500:#22543D;--chakra-colors-green-600:#183130;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#E5F2FF;--chakra-colors-blue-200:#7DC0FF;--chakra-colors-blue-300:#0081FA;--chakra-colors-blue-400:#005AAF;--chakra-colors-blue-500:#00417D;--chakra-colors-blue-600:#0D3352;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#F3E0FF;--chakra-colors-purple-200:#C363FF;--chakra-colors-purple-300:#7B00C7;--chakra-colors-purple-400:#56008B;--chakra-colors-purple-500:#310050;--chakra-colors-purple-600:#321859;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-colors-linkedin-50:#E8F4F9;--chakra-colors-linkedin-100:#CFEDFB;--chakra-colors-linkedin-200:#9BDAF3;--chakra-colors-linkedin-300:#68C7EC;--chakra-colors-linkedin-400:#34B3E4;--chakra-colors-linkedin-500:#00A0DC;--chakra-colors-linkedin-600:#008CC9;--chakra-colors-linkedin-700:#0077B5;--chakra-colors-linkedin-800:#005E93;--chakra-colors-linkedin-900:#004471;--chakra-colors-facebook-50:#E8F4F9;--chakra-colors-facebook-100:#D9DEE9;--chakra-colors-facebook-200:#B7C2DA;--chakra-colors-facebook-300:#6482C0;--chakra-colors-facebook-400:#4267B2;--chakra-colors-facebook-500:#385898;--chakra-colors-facebook-600:#314E89;--chakra-colors-facebook-700:#29487D;--chakra-colors-facebook-800:#223B67;--chakra-colors-facebook-900:#1E355B;--chakra-colors-messenger-50:#D0E6FF;--chakra-colors-messenger-100:#B9DAFF;--chakra-colors-messenger-200:#A2CDFF;--chakra-colors-messenger-300:#7AB8FF;--chakra-colors-messenger-400:#2E90FF;--chakra-colors-messenger-500:#0078FF;--chakra-colors-messenger-600:#0063D1;--chakra-colors-messenger-700:#0052AC;--chakra-colors-messenger-800:#003C7E;--chakra-colors-messenger-900:#002C5C;--chakra-colors-whatsapp-50:#dffeec;--chakra-colors-whatsapp-100:#b9f5d0;--chakra-colors-whatsapp-200:#90edb3;--chakra-colors-whatsapp-300:#65e495;--chakra-colors-whatsapp-400:#3cdd78;--chakra-colors-whatsapp-500:#22c35e;--chakra-colors-whatsapp-600:#179848;--chakra-colors-whatsapp-700:#0c6c33;--chakra-colors-whatsapp-800:#01421c;--chakra-colors-whatsapp-900:#001803;--chakra-colors-twitter-50:#E5F4FD;--chakra-colors-twitter-100:#C8E9FB;--chakra-colors-twitter-200:#A8DCFA;--chakra-colors-twitter-300:#83CDF7;--chakra-colors-twitter-400:#57BBF5;--chakra-colors-twitter-500:#1DA1F2;--chakra-colors-twitter-600:#1A94DA;--chakra-colors-twitter-700:#1681BF;--chakra-colors-twitter-800:#136B9E;--chakra-colors-twitter-900:#0D4D71;--chakra-colors-telegram-50:#E3F2F9;--chakra-colors-telegram-100:#C5E4F3;--chakra-colors-telegram-200:#A2D4EC;--chakra-colors-telegram-300:#7AC1E4;--chakra-colors-telegram-400:#47A9DA;--chakra-colors-telegram-500:#0088CC;--chakra-colors-telegram-600:#007AB8;--chakra-colors-telegram-700:#006BA1;--chakra-colors-telegram-800:#005885;--chakra-colors-telegram-900:#003F5E;--chakra-colors-silver-100:#FDFDFD;--chakra-colors-silver-200:#F7F9F9;--chakra-colors-silver-300:#F2F4F4;--chakra-colors-silver-400:#E7E9E9;--chakra-colors-silver-500:#C7CFCE;--chakra-colors-navy-100:#5C95B2;--chakra-colors-navy-200:#467B95;--chakra-colors-navy-300:#365E72;--chakra-colors-navy-400:#254250;--chakra-colors-navy-450:#182C35;--chakra-colors-navy-500:#15252D;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:Aeonik,sans-serif;--chakra-fonts-body:Inter,sans-serif;--chakra-fonts-mono:Fira Code,monospace;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.9rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.1rem;--chakra-fontSizes-xl:1.2rem;--chakra-fontSizes-2xl:1.3rem;--chakra-fontSizes-3xl:1.7rem;--chakra-fontSizes-4xl:2.1rem;--chakra-fontSizes-5xl:2.8rem;--chakra-fontSizes-6xl:4rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0-5:0.125rem;--chakra-space-1-5:0.375rem;--chakra-space-2-5:0.625rem;--chakra-space-3-5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0-5:0.125rem;--chakra-sizes-1-5:0.375rem;--chakra-sizes-2-5:0.625rem;--chakra-sizes-3-5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;--chakra-fontWeights-strong:var(--chakra-fontWeights-semibold);--chakra-colors-bg:#FDFDFD;--chakra-colors-text:#384341;--chakra-colors-border:#E7E9E9;--chakra-colors-primary:#254250;--chakra-colors-secondary:#546461;--chakra-colors-tertiary:var(--chakra-colors-blue-400);--chakra-colors-link:var(--chakra-colors-gray-800);}.chakra-ui-dark :host:not([data-theme]),.chakra-ui-dark :root:not([data-theme]),.chakra-ui-dark [data-theme]:not([data-theme]),[data-theme=dark] :host:not([data-theme]),[data-theme=dark] :root:not([data-theme]),[data-theme=dark] [data-theme]:not([data-theme]),:host[data-theme=dark],:root[data-theme=dark],[data-theme][data-theme=dark]{--chakra-fontWeights-strong:var(--chakra-fontWeights-bold);--chakra-colors-bg:#13222A;--chakra-colors-text:#C7CFCE;--chakra-colors-border:#254250;--chakra-colors-primary:#467B95;--chakra-colors-secondary:#13222A;--chakra-colors-tertiary:var(--chakra-colors-navy-100);--chakra-colors-link:var(--chakra-colors-gray-100);}</style><style data-emotion="css-global 1jqlf9g">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;font-feature-settings:'kern';}*,*::before,*::after{border-width:0;border-style:solid;box-sizing:border-box;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}b,strong{font-weight:bold;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible;}button,select{text-transform:none;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none!important;}input[type="number"]{-moz-appearance:textfield;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:list-item;}template{;}[hidden]{!important;}body,blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0;}button{background:transparent;padding:0;}fieldset{margin:0;padding:0;}ol,ul{margin:0;padding:0;}textarea{resize:vertical;}button,[role="button"]{cursor:pointer;}button::-moz-focus-inner{border:0!important;}table{border-collapse:collapse;}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit;}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit;}img,svg,video,canvas,audio,iframe,embed,object{display:block;}img,video{max-width:100%;height:auto;}[data-js-focus-visible] :focus:not([data-focus-visible-added]){outline:none;box-shadow:none;}select::-ms-expand{;}</style><style data-emotion="css-global 1w3foko">body{font-family:var(--chakra-fonts-body);color:var(--chakra-colors-text);background:var(--chakra-colors-bg);transition-property:background-color;transition-duration:var(--chakra-transition-duration-normal);line-height:var(--chakra-lineHeights-base);}*,*::before,::after{border-color:var(--chakra-colors-gray-200);word-wrap:break-word;}strong{font-weight:var(--chakra-fontWeights-strong);}code{font-size:var(--chakra-fontSizes-sm);color:var(--chakra-colors-text);background-color:var(--chakra-colors-silver-400);}.chakra-ui-dark code:not([data-theme]),[data-theme=dark] code:not([data-theme]),code[data-theme=dark]{background-color:var(--chakra-colors-black-200);}pre{font-size:var(--chakra-fontSizes-sm);}mark{background:var(--chakra-colors-transparent);color:inherit;-webkit-text-decoration:underline;text-decoration:underline;}*{border-color:var(--chakra-colors-border);}*::-webkit-input-placeholder{color:var(--chakra-colors-gray-400);}*::-moz-placeholder{color:var(--chakra-colors-gray-400);}*:-ms-input-placeholder{color:var(--chakra-colors-gray-400);}*::placeholder{color:var(--chakra-colors-gray-400);}</style><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><style data-emotion="css 1q4huee">.css-1q4huee{position:-webkit-sticky;position:sticky;top:0px;z-index:2;}</style><div class="css-1q4huee"><style data-emotion="css 5779hp">.css-5779hp{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);box-sizing:content-box;background:var(--chakra-colors-bg);height:60px;border-bottom-width:1px;}</style><header class="css-5779hp"><style data-emotion="css 1nb7rj6">.css-1nb7rj6{;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}.css-1nb7rj6>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:var(--chakra-space-4);margin-inline-start:var(--chakra-space-4);}@media screen and (min-width: 48em){.css-1nb7rj6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><div class="chakra-stack css-1nb7rj6"><style data-emotion="css czg0pa">.css-czg0pa{;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media screen and (min-width: 48em){.css-czg0pa{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><a class="css-czg0pa" href="/docs/"><style data-emotion="css 13g5z56">.css-13g5z56{fill:var(--chakra-colors-current);height:var(--chakra-sizes-6);margin-top:var(--chakra-space-0-5);}</style><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 677 232" role="img" aria-label="Apollo logo" class="css-13g5z56"><path d="M380.384 135.951a43.6 43.6 0 01-16.701 17.311q-10.726 6.248-24.439 6.246-13.711-.001-24.438-6.246a43.55 43.55 0 01-16.701-17.311q-5.976-11.064-5.974-24.777t5.974-24.779a43.6 43.6 0 0116.701-17.31q10.724-6.244 24.438-6.246 13.716-.003 24.439 6.246a43.63 43.63 0 0116.701 17.31q5.973 11.068 5.974 24.779 0 13.715-5.974 24.777m-64.22-8.757q3.259 7.062 9.233 11.065 5.973 4.005 13.849 4.006 7.739 0 13.712-4.006 5.975-4.005 9.233-11.065t3.258-16.02q0-8.962-3.258-16.021t-9.233-11.066q-5.973-4.006-13.712-4.005-7.877 0-13.849 4.005t-9.233 11.066q-3.258 7.06-3.258 16.021 0 8.96 3.258 16.02m354.773 8.757a43.6 43.6 0 01-16.701 17.311q-10.726 6.248-24.438 6.246-13.713-.001-24.439-6.246a43.56 43.56 0 01-16.701-17.311q-5.976-11.064-5.974-24.777t5.974-24.779a43.6 43.6 0 0116.701-17.31q10.723-6.244 24.439-6.246t24.438 6.246a43.63 43.63 0 0116.701 17.31q5.973 11.068 5.974 24.779 0 13.715-5.974 24.777m-64.219-8.757q3.258 7.062 9.232 11.065 5.974 4.005 13.849 4.006 7.738 0 13.713-4.006 5.973-4.005 9.232-11.065t3.258-16.02q0-8.962-3.258-16.021t-9.232-11.066-13.713-4.005q-7.876 0-13.849 4.005t-9.232 11.066-3.259 16.021q0 8.96 3.259 16.02M158.1 142.017l-4.483-12.738-5.902-16.773-4.27-12.138-5.59-15.886-6.494-18.452H99.864l-5.027 14.288-4.482 12.738-22.263 63.263h20.773l6.517-18.465h31.502l-5.59-15.887h-20.345l4.27-12.138 8.919-25.347 1.475-4.195 1.475 4.195 25.266 71.823.006.015h20.773zm103.893-67.909q7.059 8.08 7.059 20.84 0 13.443-6.992 21.656-6.992 8.215-21.655 8.215h-27.154v31.498h-20.774V66.03h47.928q14.527 0 21.588 8.078m-28.104 34.69q7.194 0 10.454-3.666t3.258-10.047q0-13.035-13.577-13.034h-20.773v26.747zM434.986 66.03v73.86h42.225v16.428h-62.998V66.03zm85.965 0v73.86h42.224v16.428h-62.997V66.03z"/><path d="M179.013 36.657a12.043 12.043 0 0011.492-15.648 12.04 12.04 0 00-18.374-6.273A115.64 115.64 0 00.138 121.292a115.65 115.65 0 0064.487 98.129 115.64 115.64 0 00117.086-8.87 4.7 4.7 0 001.275-1.327 4.729 4.729 0 00.633-3.554 4.713 4.713 0 00-5.619-3.593 4.7 4.7 0 00-1.686.738 106.2 106.2 0 01-107.405 8.17 106.195 106.195 0 1198.208-188.243 12.04 12.04 0 002.743 9.697 12.05 12.05 0 009.153 4.218"/></svg><style data-emotion="css 1jjeg89">.css-1jjeg89{margin-left:var(--chakra-space-1-5);-webkit-padding-start:var(--chakra-space-1-5);padding-inline-start:var(--chakra-space-1-5);-webkit-padding-end:var(--chakra-space-1-5);padding-inline-end:var(--chakra-space-1-5);font-size:var(--chakra-fontSizes-xs);font-weight:var(--chakra-fontWeights-semibold);text-transform:uppercase;letter-spacing:var(--chakra-letterSpacings-widest);border-radius:var(--chakra-radii-sm);border-width:1px;border-color:var(--chakra-colors-gray-300);}.chakra-ui-dark .css-1jjeg89:not([data-theme]),[data-theme=dark] .css-1jjeg89:not([data-theme]),.css-1jjeg89[data-theme=dark]{background:var(--chakra-colors-bg);border-color:var(--chakra-colors-navy-400);color:inherit;}</style><div class="css-1jjeg89">Docs</div></a><style data-emotion="css 1xb1ln9">.css-1xb1ln9{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-2xl);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);color:inherit;padding:0px;margin-left:calc(var(--chakra-space-2) * -1);}.css-1xb1ln9:focus,.css-1xb1ln9[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-1xb1ln9[disabled],.css-1xb1ln9[aria-disabled=true],.css-1xb1ln9[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-1xb1ln9:hover,.css-1xb1ln9[data-hover]{background:var(--chakra-colors-gray-100);}.css-1xb1ln9:hover[disabled],.css-1xb1ln9[data-hover][disabled],.css-1xb1ln9:hover[aria-disabled=true],.css-1xb1ln9[data-hover][aria-disabled=true],.css-1xb1ln9:hover[data-disabled],.css-1xb1ln9[data-hover][data-disabled]{background:initial;}.css-1xb1ln9:active,.css-1xb1ln9[data-active]{background:var(--chakra-colors-gray-200);}@media screen and (min-width: 48em){.css-1xb1ln9{;}}</style><button type="button" class="chakra-button css-1xb1ln9"><style data-emotion="css 1yue7os">.css-1yue7os{width:1em;height:1em;fill:none;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M1.906 11.752h12.188M1.906 8.002h12.188M1.906 4.252h12.188"/></svg></button></div><style data-emotion="css 4n2bpy">.css-4n2bpy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}.css-4n2bpy>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}@media screen and (min-width: 48em){.css-4n2bpy{;}}</style><div class="chakra-stack css-4n2bpy"><button type="button" class="chakra-button css-1xb1ln9"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M1.906 11.752h12.188M1.906 8.002h12.188M1.906 4.252h12.188"/></svg></button><style data-emotion="css z1c7hf">.css-z1c7hf{fill:var(--chakra-colors-current);height:var(--chakra-sizes-8);}</style><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 441 441" class="css-z1c7hf"><path d="M315.708 281.197l-10.062-28.595-13.251-37.652-9.586-27.249-12.548-35.661-14.577-41.421h-70.705l-11.286 32.074-10.063 28.595-49.974 142.015h46.633l14.629-41.453h70.718l-12.549-35.662h-45.672L197 208.94l20.021-56.9 3.309-9.418 3.31 9.418 56.72 161.23.013.033h46.632z"/><path d="M412.554 112.354a8.996 8.996 0 00-12.252-3.416 8.994 8.994 0 00-3.416 12.252A202.438 202.438 0 1118.767 238.032a202.44 202.44 0 01155.295-214.66 202.44 202.44 0 01140.257 17.7 27.521 27.521 0 109.38-15.388 220.434 220.434 0 1088.855 86.671z"/></svg></div><style data-emotion="css ehkx9j">.css-ehkx9j{;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-width:1px;height:var(--chakra-sizes-10);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);line-height:var(--chakra-lineHeights-none);width:var(--chakra-sizes-full);border-radius:var(--chakra-radii-md);background:var(--chakra-colors-gray-50);-webkit-margin-start:var(--chakra-space-10);margin-inline-start:var(--chakra-space-10);-webkit-margin-end:var(--chakra-space-10);margin-inline-end:var(--chakra-space-10);}@media screen and (min-width: 30em){.css-ehkx9j{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}.chakra-ui-dark .css-ehkx9j:not([data-theme]),[data-theme=dark] .css-ehkx9j:not([data-theme]),.css-ehkx9j[data-theme=dark]{background:var(--chakra-colors-black-200);}.css-ehkx9j:focus,.css-ehkx9j[data-focus]{outline:2px solid transparent;outline-offset:2px;box-shadow:var(--chakra-shadows-outline);}@media screen and (min-width: 48em){.css-ehkx9j{-webkit-margin-start:88px;margin-inline-start:88px;-webkit-margin-end:88px;margin-inline-end:88px;}}</style><button class="css-ehkx9j"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M10.638 10.637l4.393 4.394M1.42 8.848a5.665 5.665 0 1010.428-4.432A5.665 5.665 0 001.42 8.848"/></svg><style data-emotion="css z89do">.css-z89do{margin-left:var(--chakra-space-2);color:var(--chakra-colors-gray-500);}.chakra-ui-dark .css-z89do:not([data-theme]),[data-theme=dark] .css-z89do:not([data-theme]),.css-z89do[data-theme=dark]{color:var(--chakra-colors-gray-400);}</style><div class="css-z89do">Search Apollo (Cmd+K or /)</div></button><style data-emotion="css ax1pn7">.css-ax1pn7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-xl);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);background:var(--chakra-colors-gray-100);padding:0px;margin-left:auto;margin-right:var(--chakra-space-2);}.css-ax1pn7:focus,.css-ax1pn7[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-ax1pn7[disabled],.css-ax1pn7[aria-disabled=true],.css-ax1pn7[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-ax1pn7:hover,.css-ax1pn7[data-hover]{background:var(--chakra-colors-gray-200);}.css-ax1pn7:hover[disabled],.css-ax1pn7[data-hover][disabled],.css-ax1pn7:hover[aria-disabled=true],.css-ax1pn7[data-hover][aria-disabled=true],.css-ax1pn7:hover[data-disabled],.css-ax1pn7[data-hover][data-disabled]{background:var(--chakra-colors-gray-100);}.css-ax1pn7:active,.css-ax1pn7[data-active]{background:var(--chakra-colors-gray-300);}@media screen and (min-width: 30em){.css-ax1pn7{;}}</style><button type="button" class="chakra-button css-ax1pn7"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M10.638 10.637l4.393 4.394M1.42 8.848a5.665 5.665 0 1010.428-4.432A5.665 5.665 0 001.42 8.848"/></svg></button><style data-emotion="css 1lhxmcv">.css-1lhxmcv{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-xl);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);color:inherit;padding:0px;}.css-1lhxmcv:focus,.css-1lhxmcv[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-1lhxmcv[disabled],.css-1lhxmcv[aria-disabled=true],.css-1lhxmcv[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-1lhxmcv:hover,.css-1lhxmcv[data-hover]{background:var(--chakra-colors-gray-100);}.css-1lhxmcv:hover[disabled],.css-1lhxmcv[data-hover][disabled],.css-1lhxmcv:hover[aria-disabled=true],.css-1lhxmcv[data-hover][aria-disabled=true],.css-1lhxmcv:hover[data-disabled],.css-1lhxmcv[data-hover][data-disabled]{background:initial;}.css-1lhxmcv:active,.css-1lhxmcv[data-active]{background:var(--chakra-colors-gray-200);}</style><button type="button" class="chakra-button css-1lhxmcv" aria-label="Toggle color mode"><style data-emotion="css 1635hll">.css-1635hll{width:1em;height:1em;;line-height:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:currentColor;}.chakra-ui-dark .css-1635hll:not([data-theme]),[data-theme=dark] .css-1635hll:not([data-theme]),.css-1635hll[data-theme=dark]{display:block;}</style><style data-emotion="css g0k1du">.css-g0k1du{width:1em;height:1em;fill:none;width:1em;height:1em;;line-height:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:currentColor;}.chakra-ui-dark .css-g0k1du:not([data-theme]),[data-theme=dark] .css-g0k1du:not([data-theme]),.css-g0k1du[data-theme=dark]{display:block;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" focusable="false" class="chakra-icon css-g0k1du"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M6 1.43V.727m3.232 2.041l.497-.497M10.57 6h.703M9.232 9.232l.497.497M6 10.57v.703M2.768 9.232l-.497.497M1.43 6H.727m2.041-3.232l-.497-.497M2.836 6a3.164 3.164 0 106.328 0 3.164 3.164 0 00-6.328 0"/></svg><style data-emotion="css 96l0r5">.css-96l0r5{width:1em;height:1em;display:block;line-height:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:currentColor;}.chakra-ui-dark .css-96l0r5:not([data-theme]),[data-theme=dark] .css-96l0r5:not([data-theme]),.css-96l0r5[data-theme=dark]{;}</style><style data-emotion="css 1pk6gfg">.css-1pk6gfg{width:1em;height:1em;fill:none;width:1em;height:1em;display:block;line-height:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:currentColor;}.chakra-ui-dark .css-1pk6gfg:not([data-theme]),[data-theme=dark] .css-1pk6gfg:not([data-theme]),.css-1pk6gfg[data-theme=dark]{;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" focusable="false" class="chakra-icon css-1pk6gfg"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M5.993 2.133h2.11M7.047 1.078v2.11m2.109 1.054h1.406M9.86 3.54v1.406M8.454 7.758a4.57 4.57 0 01-4.371-5.906 4.568 4.568 0 106.281 5.484 4.54 4.54 0 01-1.91.422"/></svg></button><style data-emotion="css 15upxst">.css-15upxst{;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);color:navy.600;background:var(--chakra-colors-transparent);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-left:var(--chakra-space-2);}.css-15upxst:focus,.css-15upxst[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-15upxst[disabled],.css-15upxst[aria-disabled=true],.css-15upxst[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-15upxst:hover,.css-15upxst[data-hover]{background:navy.50;}.css-15upxst:hover[disabled],.css-15upxst[data-hover][disabled],.css-15upxst:hover[aria-disabled=true],.css-15upxst[data-hover][aria-disabled=true],.css-15upxst:hover[data-disabled],.css-15upxst[data-hover][data-disabled]{background:initial;}.css-15upxst:active,.css-15upxst[data-active]{background:var(--chakra-colors-navy-100);}.chakra-ui-dark .css-15upxst:not([data-theme]),[data-theme=dark] .css-15upxst:not([data-theme]),.css-15upxst[data-theme=dark]{color:var(--chakra-colors-silver-300);}@media screen and (min-width: 62em){.css-15upxst{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><a class="chakra-button css-15upxst" href="https://studio.apollographql.com/signup?referrer=docs" target="_blank" rel="noopener noreferrer">Launch GraphOS Studio<style data-emotion="css 1hzyiq5">.css-1hzyiq5{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}</style><span class="chakra-button__icon css-1hzyiq5"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M2 8h12m0 0L8.333 2.333M14 8l-5.667 5.667"/></svg></span></a></header></div><style data-emotion="css 126amg">.css-126amg{;width:373px;height:calc(100vh - 61px);position:fixed;left:0px;z-index:1;transition-property:visibility,opacity,transform;transition-duration:var(--chakra-transition-duration-normal);top:61px;}@media screen and (min-width: 48em){.css-126amg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><aside style="visibility:visible;opacity:1;transform:none" class="css-126amg"><style data-emotion="css 1sg92dp">.css-1sg92dp{color:var(--chakra-colors-text);font-weight:var(--chakra-fontWeights-semibold);background-color:var(--chakra-colors-bg);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:none;width:280px;}</style><div class="css-1sg92dp"><style data-emotion="css 15wiczr">.css-15wiczr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:var(--chakra-space-4);}</style><div class="chakra-stack css-15wiczr"><div><style data-emotion="css qs1qrj">.css-qs1qrj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:var(--chakra-space-4);font-size:var(--chakra-fontSizes-md);}.css-qs1qrj span{opacity:0;}</style><div class="css-qs1qrj">Welcome</div><style data-emotion="css btweb">.css-btweb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.css-btweb>*:not(style)~*:not(style){margin-top:var(--chakra-space-2);-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;}</style><nav class="chakra-stack css-btweb"><style data-emotion="css 1oldzvp">.css-1oldzvp{-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding-top:var(--chakra-space-2);padding-bottom:var(--chakra-space-2);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;position:relative;border-radius:var(--chakra-radii-md);background:inherit;color:inherit;}.css-1oldzvp::after{width:var(--chakra-sizes-4);background:var(--chakra-colors-primary);left:100%;top:0px;bottom:0px;}</style><a tabindex="0" class="css-1oldzvp" href="/docs/"><style data-emotion="css 9hpz1u">.css-9hpz1u{font-size:var(--chakra-fontSizes-2xl);}</style><div class="css-9hpz1u"><style data-emotion="css 1yue7os">.css-1yue7os{width:1em;height:1em;fill:none;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M2.846 9.215v5.156h3.75v-3.75a.94.94 0 01.937-.937h.938a.94.94 0 01.937.937v3.75h3.75V9.215M.971 8.277L7.339 1.91a.937.937 0 011.326 0l6.368 6.368"/></svg></div><style data-emotion="css 16ysccx">.css-16ysccx{margin-left:var(--chakra-space-3);opacity:0;transition-property:opacity;transition-duration:var(--chakra-transition-duration-normal);transition-timing-function:var(--chakra-transition-easing-ease-in-out);margin-right:var(--chakra-space-3);}</style><span class="css-16ysccx">Home</span></a><a href="https://www.apollographql.com/tutorials" target="_blank" tabindex="0" class="css-1oldzvp"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M12.219 5.563v3.375Q8 11.563 3.78 8.938V5.563m-1.687-.625v5.75m0 0c.625 0 1.125.5 1.125 1.125v2.375H.969v-2.375c0-.625.5-1.125 1.125-1.125m5.875-3.563l-7-2.625 7-2.687L15.03 4.5z"/></svg></div><span class="css-16ysccx">Odyssey Tutorials</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M6.281 9.577l8.75-8.608m0 0v4.92m0-4.92h-5M8.078 4.094H1.516a.547.547 0 00-.547.547v9.843a.547.547 0 00.547.547h9.843a.547.547 0 00.547-.547V7.922"/></svg></a></nav></div><style data-emotion="css qr0y0">.css-qr0y0{border-width:0;-webkit-align-self:stretch;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;border-color:var(--chakra-colors-border);width:auto;height:auto;width:61px;}.css-qr0y0{margin-top:var(--chakra-space-4);margin-bottom:var(--chakra-space-4);-webkit-margin-start:0px;margin-inline-start:0px;-webkit-margin-end:0px;margin-inline-end:0px;border-left-width:0;border-bottom-width:1px;}</style><div class="chakra-stack__divider css-qr0y0"/><div><div class="css-qs1qrj">SDKs</div><nav class="chakra-stack css-btweb"><style data-emotion="css 106t0rh">.css-106t0rh{-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding-top:var(--chakra-space-2);padding-bottom:var(--chakra-space-2);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;position:relative;border-radius:var(--chakra-radii-md);border-top-right-radius:0px;border-bottom-right-radius:0px;background:var(--chakra-colors-primary);color:var(--chakra-colors-white);}.css-106t0rh::after{content:"";width:var(--chakra-sizes-4);background:var(--chakra-colors-primary);left:100%;top:0px;bottom:0px;}</style><a tabindex="0" class="css-106t0rh" href="/docs/apollo-server"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M5.884 6.018a2.344 2.344 0 001.657 4l2.344-2.343a2.344 2.344 0 00-4-1.657m0 0l-.994-.995m6.216 4.079a3.29 3.29 0 01-1.993 1.996m3.98-2.215a5.16 5.16 0 01-4.205 4.205m6.143-4.673a7.03 7.03 0 01-6.718 6.616M9.86 2.574l1.327-1.326s.662-.662 1.325 0l1.326 1.326s.663.663 0 1.326l-1.325 1.326s-.664.663-1.326 0L9.86 3.9s-.662-.662 0-1.326m-8.617 8.747l1.325-1.325s.663-.663 1.326 0l1.326 1.325s.662.663 0 1.326l-1.326 1.326s-.662.663-1.326 0l-1.325-1.326s-.663-.662 0-1.326"/></svg></div><span class="css-16ysccx">Apollo Server</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/react"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M11.271 7.914c.388.81.693 1.657.912 2.527 1.74-.512 2.848-1.353 2.848-2.375 0-1.042-1.15-1.897-2.95-2.405M4.72 7.914a13.4 13.4 0 01-.812-2.25C2.114 6.173.971 7.026.971 8.066c0 1.02 1.104 1.86 2.84 2.375M6.266 5.24A13.443 13.443 0 018 3.187c-1.313-1.25-2.596-1.79-3.48-1.28-.903.521-1.069 1.945-.609 3.758"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M9.541 10.913A13.5 13.5 0 018 12.74c1.338 1.299 2.65 1.865 3.55 1.345.884-.51 1.06-1.887.635-3.645m-5.733.472c-.895-.07-1.78-.228-2.644-.474-.427 1.763-.25 3.143.633 3.654.901.521 2.217-.047 3.557-1.351m1.73-7.502c.795.07 1.583.212 2.354.422.457-1.808.29-3.227-.61-3.75-.884-.507-2.163.026-3.472 1.277"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M9.728 5.239A18 18 0 008 5.155c-.602 0-1.18.031-1.734.084q-.428.614-.83 1.309c-.269.463-.5.918-.715 1.366a18 18 0 001.728 2.998c1.028.088 2.062.088 3.09 0a17.8 17.8 0 001.731-2.998A18 18 0 009.728 5.24"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M7.063 8.066a.937.937 0 101.874 0 .937.937 0 00-1.874 0"/></svg></div><span class="css-16ysccx">Client (React)</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/kotlin"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path d="M.969.969V15.03L15.03.97zM8 8l7.031 7.031H.97M8 .969L1.119 7.85" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/></svg></div><span class="css-16ysccx">Client (Kotlin)</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/ios"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M7.694 7.375c-2.444-1.519-4.613-4.9-4.613-4.9s1.794 4.719 5.088 7.819A7.26 7.26 0 012.463 8a8.5 8.5 0 01-1.207-1.519.144.144 0 00-.187-.031.18.18 0 00-.094.194 9.2 9.2 0 002.419 4.094c2.662 2.662 6.331 3.4 8.662 1.875q.677.206 1.382.268c1.212.625 1.212.913 1.212.913a1.6 1.6 0 00.306-1.519 1.42 1.42 0 00-.625-1.513l-.556-.343c.844-2.3 0-5.413-2.344-7.75a7 7 0 00-.487-.457.156.156 0 00-.207 0 .16.16 0 00-.043.2c1.318 2.094 1.512 4.488.437 6.113a25.9 25.9 0 01-5.137-6.05"/></svg></div><span class="css-16ysccx">Client (iOS)</span></a></nav></div><div class="chakra-stack__divider css-qr0y0"/><div><div class="css-qs1qrj">GraphOS<!-- --> <style data-emotion="css zdpt2t">.css-zdpt2t{margin-left:auto;}</style><span class="css-zdpt2t"><style data-emotion="css 15aywdm">.css-15aywdm{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-8);min-width:var(--chakra-sizes-8);font-size:var(--chakra-fontSizes-sm);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);background:var(--chakra-colors-whiteAlpha-200);}.css-15aywdm:focus,.css-15aywdm[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-15aywdm[disabled],.css-15aywdm[aria-disabled=true],.css-15aywdm[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-15aywdm:hover,.css-15aywdm[data-hover]{background:var(--chakra-colors-whiteAlpha-300);}.css-15aywdm:hover[disabled],.css-15aywdm[data-hover][disabled],.css-15aywdm:hover[aria-disabled=true],.css-15aywdm[data-hover][aria-disabled=true],.css-15aywdm:hover[data-disabled],.css-15aywdm[data-hover][data-disabled]{background:var(--chakra-colors-whiteAlpha-200);}.css-15aywdm:active,.css-15aywdm[data-active]{background:var(--chakra-colors-whiteAlpha-400);}</style><a class="chakra-button css-15aywdm" href="/docs/graphos/quickstart/cloud"><style data-emotion="css 1wh2kri">.css-1wh2kri{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-margin-end:0.5rem;margin-inline-end:0.5rem;}</style><span class="chakra-button__icon css-1wh2kri"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M3.831 11.655a5.966 5.966 0 016.96-9.6M1.74 11.613C.98 12.94.727 13.97 1.155 14.4c.65.65 2.684-.269 5.039-2.136m2.695-.472L6.652 9.554m2.237 2.238l4.973-4.974c.406-.405.693-.913.832-1.47l.32-1.28a.527.527 0 00-.639-.64l-1.28.322a3.16 3.16 0 00-1.47.831L6.652 9.554m2.237 2.238l.611 1.833a.263.263 0 00.437.103l.64-.639a2.11 2.11 0 00.51-2.163l-.333-1zM6.652 9.554l-1.833-.61a.264.264 0 01-.103-.438l.639-.639a2.11 2.11 0 012.164-.51l1 .332z"/></svg></span>Get started</a></span></div><nav class="chakra-stack css-btweb"><a tabindex="0" class="css-1oldzvp" href="/docs/graphos"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M8.938 9.405a2.344 2.344 0 110-4.687 2.344 2.344 0 010 4.687m0 0v2.813m0 0a1.406 1.406 0 110 2.812 1.406 1.406 0 010-2.812m-5.569.411a1.406 1.406 0 11-1.988 1.99 1.406 1.406 0 011.988-1.99m0 0l3.913-3.912m3.312-3.312l2.038-2.037m-1.636 4.815l1.428 1.428M6.751 6.218L4.006 4.571m8.213-2.197a1.406 1.406 0 102.811 0 1.406 1.406 0 00-2.811 0m0 7.968a1.406 1.406 0 102.811.001 1.406 1.406 0 00-2.811 0M1.438 3.78a1.406 1.406 0 102.812 0 1.406 1.406 0 00-2.812 0"/></svg></div><span class="css-16ysccx">Graph Essentials</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/delivery"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M12 2.667h2M6.667 13.333S11 11.667 8 8s1.333-5.333 1.333-5.333M2 13.333h2M6.667 14a.666.666 0 100-1.333.666.666 0 000 1.333M9.333 3.333a.667.667 0 100-1.333.667.667 0 000 1.333"/></svg></div><span class="css-16ysccx">Schema Pipeline</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/explorer"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M1.906.969h12.188s.937 0 .937.937v12.188s0 .937-.937.937H1.906s-.937 0-.937-.937V1.906s0-.937.937-.937"/><path d="M6.899 10.288a.535.535 0 01-.774-.48V6.192a.535.535 0 01.774-.478l3.618 1.809a.534.534 0 010 .956z"/></g></svg></div><span class="css-16ysccx">Explorer IDE</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/metrics"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M.969 15.031H15.03M2.5 6.338L5.531 2.63m7.663 1.357l-6.169-1.82m-2.775 8.8H2.375a.475.475 0 00-.469.47v3.593H4.72v-3.594a.475.475 0 00-.469-.468m4.688-5H7.062a.475.475 0 00-.468.47v8.593h2.812V6.438a.475.475 0 00-.469-.47m4.687 3.126H11.75a.475.475 0 00-.469.469v5.468h2.813V9.562a.476.476 0 00-.469-.468M.969 7.063a.937.937 0 101.875 0 .937.937 0 00-1.875 0m4.219-5.157a.937.937 0 101.874 0 .937.937 0 00-1.875 0m7.968 2.344a.938.938 0 101.875 0 .938.938 0 00-1.875 0"/></svg></div><span class="css-16ysccx">Metrics & Reporting</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/org"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M.969 13.156a4.219 4.219 0 118.437 0m0-9.896a2.578 2.578 0 11-.003 4.321m.472 1.46a4.223 4.223 0 015.156 4.115M2.61 5.422a2.578 2.578 0 105.157 0 2.578 2.578 0 00-5.157 0"/></svg></div><span class="css-16ysccx">Org Management</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/federation"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M2.844 12.217a3.93 3.93 0 014.09-3.75h2.132a3.93 3.93 0 014.09 3.75m-10.312 0a1.406 1.406 0 110 2.812 1.406 1.406 0 010-2.812m10.312 0a1.406 1.406 0 110 2.812 1.406 1.406 0 010-2.812M8 4.717v7.5m0-7.5a1.875 1.875 0 110-3.75 1.875 1.875 0 010 3.75m0 7.5a1.406 1.406 0 110 2.812 1.406 1.406 0 010-2.812"/></svg></div><span class="css-16ysccx">Federation</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/rover"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M15.031 4.719H.97m7.5 4.687h2.812M4.72 7.531l1.875 1.875-1.875 1.875m-2.813 2.813a.94.94 0 01-.937-.938V2.916a1.01 1.01 0 011.01-1.01h12.048a1.01 1.01 0 011.004 1.005v10.173a1.01 1.01 0 01-1.01 1.01z"/></svg></div><span class="css-16ysccx">Rover CLI</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/cloud-routing"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M8 12.453l1.406-2.344m1.406 2.344l1.407-2.344M.969 9.273a3.11 3.11 0 013.167-3.176A4.27 4.27 0 018 3.547a4.35 4.35 0 014.267 4.187 2.32 2.32 0 012.764 2.335c0 2.423-2.445 2.385-2.445 2.385H3.72A3.194 3.194 0 01.969 9.273"/></svg></div><span class="css-16ysccx">Cloud Router</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/router"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M3.863 8.895C6.456 9.707 8 11.27 8 14.219m0 0v.813m0-.813c0-2.95 1.544-4.512 4.138-5.324M8 14.219V4.25m-1.468 0a.346.346 0 01-.298-.52l1.469-2.604a.346.346 0 01.595 0l1.468 2.603a.346.346 0 01-.298.522zM4.508 7.338a.347.347 0 00-.369-.475l-2.875.404a.346.346 0 00-.228.551l1.745 2.317a.348.348 0 00.597-.076l.563-1.36zm6.985 0a.347.347 0 01.368-.475l2.875.404a.345.345 0 01.228.551l-1.745 2.317a.348.348 0 01-.597-.076l-.563-1.36z"/></svg></div><span class="css-16ysccx">Self-Hosted Router</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/graphos/enterprise"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" d="M3.475 10.074L1.683 8.283a.4.4 0 010-.566l1.792-1.79a.4.4 0 01.565 0l1.791 1.79a.4.4 0 010 .566L4.04 10.074a.4.4 0 01-.565 0zm4.242 4.243l-1.79-1.792a.4.4 0 010-.566l1.79-1.79a.4.4 0 01.566 0l1.791 1.79a.403.403 0 010 .566l-1.791 1.792a.4.4 0 01-.566 0zm0-8.485L5.927 4.04a.4.4 0 010-.565l1.79-1.792a.4.4 0 01.566 0l1.791 1.792a.4.4 0 010 .565L8.283 5.832a.4.4 0 01-.566 0zm4.243 4.242l-1.79-1.791a.4.4 0 010-.566l1.791-1.79a.4.4 0 01.565 0l1.792 1.79a.4.4 0 010 .566l-1.792 1.791a.4.4 0 01-.565 0z"/></svg></div><span class="css-16ysccx">Enterprise Features</span></a><a tabindex="0" class="css-1oldzvp" href="/docs/technotes"><div class="css-9hpz1u"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.278 5.656h7.5m-7.5 2.813h7.5m-7.5 2.812h3.75m6.534 2.813a.94.94 0 01-.937.937H2.375a.937.937 0 01-.937-.937V1.906A.937.937 0 012.375.97h9.403c.245 0 .48.095.655.266l1.846 1.802a.94.94 0 01.284.671z"/></svg></div><span class="css-16ysccx">Tech Notes</span></a></nav></div></div></div><style data-emotion="css 37uqzm">.css-37uqzm{width:280px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-right-width:1px;border-left-width:1px;background:var(--chakra-colors-bg);-webkit-transform:translateX(-187px);-moz-transform:translateX(-187px);-ms-transform:translateX(-187px);transform:translateX(-187px);box-shadow:var(--chakra-shadows-none);transition-property:transform;transition-duration:var(--chakra-transition-duration-normal);transition-timing-function:var(--chakra-transition-easing-ease-in-out);}.chakra-ui-dark .css-37uqzm:not([data-theme]),[data-theme=dark] .css-37uqzm:not([data-theme]),.css-37uqzm[data-theme=dark]{box-shadow:var(--chakra-shadows-none);}</style><div id="sidebar" class="css-37uqzm"><style data-emotion="css dkxc91">.css-dkxc91{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:var(--chakra-sizes-full);overflow:auto;overscroll-behavior:none;}</style><div class="css-dkxc91"><style data-emotion="css 1ywaflf">.css-1ywaflf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:var(--chakra-space-4);position:-webkit-sticky;position:sticky;top:0px;z-index:1;background:var(--chakra-colors-bg);}</style><div class="css-1ywaflf"><style data-emotion="css j9srqr">.css-j9srqr{margin-right:auto;font-size:var(--chakra-fontSizes-xl);font-weight:var(--chakra-fontWeights-semibold);line-height:1.6;}</style><h2 class="css-j9srqr">Apollo Server</h2><style data-emotion="css 1komkvh">.css-1komkvh{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-8);min-width:var(--chakra-sizes-8);font-size:var(--chakra-fontSizes-sm);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);border:1px solid;border-color:var(--chakra-colors-gray-200);color:inherit;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;margin-left:var(--chakra-space-2);}.css-1komkvh:focus,.css-1komkvh[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-1komkvh[disabled],.css-1komkvh[aria-disabled=true],.css-1komkvh[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-1komkvh:hover,.css-1komkvh[data-hover]{background:var(--chakra-colors-gray-100);}.css-1komkvh:hover[disabled],.css-1komkvh[data-hover][disabled],.css-1komkvh:hover[aria-disabled=true],.css-1komkvh[data-hover][aria-disabled=true],.css-1komkvh:hover[data-disabled],.css-1komkvh[data-hover][data-disabled]{background:initial;}.css-1komkvh:active,.css-1komkvh[data-active]{background:var(--chakra-colors-gray-200);}</style><button type="button" class="chakra-button chakra-menu__menu-button css-1komkvh" id="menu-button-1" aria-expanded="false" aria-haspopup="menu" aria-controls="menu-list-1"><style data-emotion="css xl71ch">.css-xl71ch{pointer-events:none;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0px;}</style><span class="css-xl71ch">v4</span><style data-emotion="css 1hzyiq5">.css-1hzyiq5{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}</style><span class="chakra-button__icon css-1hzyiq5"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></span></button><style data-emotion="css r6z5ec">.css-r6z5ec{z-index:1;}</style><div style=";min-width:max-content;inset:0 auto auto 0" class="css-r6z5ec"><style data-emotion="css 1ozmk1d">.css-1ozmk1d{outline:2px solid transparent;outline-offset:2px;background:#fff;box-shadow:var(--chakra-shadows-sm);color:inherit;min-width:var(--chakra-sizes-3xs);padding-top:var(--chakra-space-2);padding-bottom:var(--chakra-space-2);z-index:1;border-radius:var(--chakra-radii-md);border-width:1px;}</style><div tabindex="-1" role="menu" id="menu-list-1" style="transform-origin:var(--popper-transform-origin);opacity:0;;transform:scale(0.8) translateZ(0)" aria-orientation="vertical" class="chakra-menu__menu-list css-1ozmk1d"><div class="chakra-menu__group" role="group"><style data-emotion="css 13c7rae">.css-13c7rae{-webkit-text-decoration:none;text-decoration:none;color:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:start;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;outline:2px solid transparent;outline-offset:2px;padding-top:0.4rem;padding-bottom:0.4rem;-webkit-padding-start:0.8rem;padding-inline-start:0.8rem;-webkit-padding-end:0.8rem;padding-inline-end:0.8rem;transition-property:var(--chakra-transition-property-background);transition-duration:var(--chakra-transition-duration-ultra-fast);transition-timing-function:var(--chakra-transition-easing-ease-in);}.css-13c7rae:focus,.css-13c7rae[data-focus]{background:var(--chakra-colors-gray-100);}.css-13c7rae:active,.css-13c7rae[data-active]{background:var(--chakra-colors-gray-200);}.css-13c7rae[aria-expanded=true],.css-13c7rae[data-expanded]{background:var(--chakra-colors-gray-100);}.css-13c7rae[disabled],.css-13c7rae[aria-disabled=true],.css-13c7rae[data-disabled]{opacity:0.4;cursor:not-allowed;}</style><button type="button" value="v4" id="menu-list-1-menuitem-1" role="menuitemradio" tabindex="0" aria-checked="true" class="chakra-menu__menuitem-option css-13c7rae"><style data-emotion="css usinoq">.css-usinoq{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:0.8em;-webkit-margin-end:0.75rem;margin-inline-end:0.75rem;opacity:1;}</style><span class="chakra-menu__icon-wrapper css-usinoq"><svg viewbox="0 0 14 14" width="1em" height="1em" focusable="false" aria-hidden="true" class="chakra-menu__icon"><polygon fill="currentColor" points="5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"/></svg></span><span style="flex:1">v4</span></button><button type="button" value="v3" id="menu-list-1-menuitem-1" role="menuitemradio" tabindex="0" aria-checked="false" class="chakra-menu__menuitem-option css-13c7rae"><style data-emotion="css g5m2dj">.css-g5m2dj{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:0.8em;-webkit-margin-end:0.75rem;margin-inline-end:0.75rem;opacity:0;}</style><span class="chakra-menu__icon-wrapper css-g5m2dj"><svg viewbox="0 0 14 14" width="1em" height="1em" focusable="false" aria-hidden="true" class="chakra-menu__icon"><polygon fill="currentColor" points="5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"/></svg></span><span style="flex:1">v3</span></button><button type="button" value="v2" id="menu-list-1-menuitem-1" role="menuitemradio" tabindex="0" aria-checked="false" class="chakra-menu__menuitem-option css-13c7rae"><span class="chakra-menu__icon-wrapper css-g5m2dj"><svg viewbox="0 0 14 14" width="1em" height="1em" focusable="false" aria-hidden="true" class="chakra-menu__icon"><polygon fill="currentColor" points="5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"/></svg></span><span style="flex:1">v2</span></button></div></div></div></div><style data-emotion="css 3odz8">.css-3odz8{-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding-bottom:var(--chakra-space-3);}</style><nav class="css-3odz8"><style data-emotion="css ptmkx">.css-ptmkx{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-top:0px;padding-bottom:0px;}.css-ptmkx>*:not(style)~*:not(style){margin-top:var(--chakra-space-2);-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;}</style><div class="chakra-stack css-ptmkx"><style data-emotion="css 34b800">.css-34b800{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:normal;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:var(--chakra-lineHeights-base);border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-normal);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:auto;min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);color:inherit;padding-top:var(--chakra-space-1);padding-bottom:var(--chakra-space-1);text-align:left;}.css-34b800:focus,.css-34b800[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-34b800[disabled],.css-34b800[aria-disabled=true],.css-34b800[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-34b800:hover,.css-34b800[data-hover]{background:var(--chakra-colors-gray-100);}.css-34b800:hover[disabled],.css-34b800[data-hover][disabled],.css-34b800:hover[aria-disabled=true],.css-34b800[data-hover][aria-disabled=true],.css-34b800:hover[data-disabled],.css-34b800[data-hover][data-disabled]{background:initial;}.css-34b800:active,.css-34b800[data-active]{background:var(--chakra-colors-gray-200);}</style><a class="chakra-button css-34b800" data-depth="0" href="/docs/apollo-server/"><style data-emotion="css 70qvj9">.css-70qvj9{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><span class="css-70qvj9">Introduction<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="0" href="/docs/apollo-server/getting-started"><span class="css-70qvj9">Get started<!-- --> </span></a><style data-emotion="css 1a88wtd">.css-1a88wtd{padding-left:0px;}</style><div class="css-1a88wtd"><style data-emotion="css 1htazvk">.css-1htazvk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding-top:var(--chakra-space-1-5);padding-bottom:var(--chakra-space-1-5);font-weight:var(--chakra-fontWeights-strong);text-align:left;scroll-snap-margin-top:56px;scroll-margin-top:56px;}.css-1htazvk>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}</style><button class="chakra-stack css-1htazvk" data-group="false"><span>New in v4</span><style data-emotion="css 1ixbp0l">.css-1ixbp0l{pointer-events:none;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><style data-emotion="css 7rklk1">.css-7rklk1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-top:var(--chakra-space-1);padding-bottom:var(--chakra-space-1);}.css-7rklk1>*:not(style)~*:not(style){margin-top:var(--chakra-space-1-5);-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;}</style><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/migration"><span class="css-70qvj9">Migrating to Apollo Server 4<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/previous-versions"><span class="css-70qvj9">Previous versions<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="https://github.com/apollographql/apollo-server/blob/main/packages/server/CHANGELOG.md" target="_blank" rel="noreferrer noopener"><span class="css-70qvj9">Changelog<!-- --> </span><span class="chakra-button__icon css-1hzyiq5"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M6.281 9.577l8.75-8.608m0 0v4.92m0-4.92h-5M8.078 4.094H1.516a.547.547 0 00-.547.547v9.843a.547.547 0 00.547.547h9.843a.547.547 0 00.547-.547V7.922"/></svg></span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Defining a Schema</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/schema/schema"><span class="css-70qvj9">Schema basics<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/schema/unions-interfaces"><span class="css-70qvj9">Unions and interfaces<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/schema/custom-scalars"><span class="css-70qvj9">Custom scalars<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/schema/directives"><span class="css-70qvj9">Directives<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Resolving Operations</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/resolvers"><span class="css-70qvj9">Resolvers<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/context"><span class="css-70qvj9">Sharing context<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/errors"><span class="css-70qvj9">Error handling<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/subscriptions"><span class="css-70qvj9">Subscriptions<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Fetching Data</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/fetching-data"><span class="css-70qvj9">Overview<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/data/fetching-rest"><span class="css-70qvj9">REST APIs<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Web Frameworks</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/integrations/integration-index"><span class="css-70qvj9">Integrations<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/integrations/building-integrations"><span class="css-70qvj9">Building integrations<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/integrations/mern"><span class="css-70qvj9">MERN stack tutorial<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Development Workflow</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/workflow/build-run-queries"><span class="css-70qvj9">Build and run queries<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/workflow/requests"><span class="css-70qvj9">Request format<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/workflow/generate-types"><span class="css-70qvj9">Generating TS types<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/testing/mocking"><span class="css-70qvj9">Mocking<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/testing/testing"><span class="css-70qvj9">Integration testing<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="https://www.apollographql.com/docs/studio/explorer/"><span class="css-70qvj9">Apollo Studio Explorer<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Performance</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/performance/caching"><span class="css-70qvj9">Caching<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/performance/cache-backends"><span class="css-70qvj9">Cache backends<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/performance/apq"><span class="css-70qvj9">Automatic persisted queries<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Security</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/security/authentication"><span class="css-70qvj9">Auth<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/security/cors"><span class="css-70qvj9">CORS<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/security/terminating-ssl"><span class="css-70qvj9">Terminating SSL<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/security/proxy-configuration"><span class="css-70qvj9">Proxy configuration<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Deployment</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/deployment/lambda"><span class="css-70qvj9">Lambda<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/deployment/heroku"><span class="css-70qvj9">Heroku<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Monitoring</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/monitoring/metrics"><span class="css-70qvj9">Metrics and logging<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/monitoring/health-checks"><span class="css-70qvj9">Health checks<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="true"><span>API Reference</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><style data-emotion="css d1xus3">.css-d1xus3{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:normal;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:var(--chakra-lineHeights-base);border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-normal);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:auto;min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);color:#FDFDFD;padding-top:var(--chakra-space-1);padding-bottom:var(--chakra-space-1);text-align:left;background:var(--chakra-colors-primary);}.css-d1xus3:focus,.css-d1xus3[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-d1xus3[disabled],.css-d1xus3[aria-disabled=true],.css-d1xus3[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-d1xus3:hover,.css-d1xus3[data-hover]{background:var(--chakra-colors-gray-100);}.css-d1xus3:hover[disabled],.css-d1xus3[data-hover][disabled],.css-d1xus3:hover[aria-disabled=true],.css-d1xus3[data-hover][aria-disabled=true],.css-d1xus3:hover[data-disabled],.css-d1xus3[data-hover][data-disabled]{background:initial;}.css-d1xus3:active,.css-d1xus3[data-active]{background:var(--chakra-colors-gray-200);}</style><a class="chakra-button css-d1xus3" data-depth="1" href="/docs/apollo-server/api/apollo-server"><span class="css-70qvj9">ApolloServer<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/api/standalone"><span class="css-70qvj9">startStandaloneServer<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/api/express-middleware"><span class="css-70qvj9">expressMiddleware<!-- --> </span></a></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Plugins</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="1" href="/docs/apollo-server/builtin-plugins"><span class="css-70qvj9">Overview<!-- --> </span></a><style data-emotion="css tvzngu">.css-tvzngu{padding-left:var(--chakra-space-2);}</style><div class="css-tvzngu"><button class="chakra-stack css-1htazvk" data-group="false"><span>Built-in</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/usage-reporting"><span class="css-70qvj9">Usage reporting<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/schema-reporting"><span class="css-70qvj9">Schema reporting<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/inline-trace"><span class="css-70qvj9">Inline trace<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/drain-http-server"><span class="css-70qvj9">Drain HTTP server<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/cache-control"><span class="css-70qvj9">Cache control<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/landing-pages"><span class="css-70qvj9">Landing pages<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/api/plugin/subscription-callback"><span class="css-70qvj9">Federated subscriptions<!-- --> </span></a></div></div></div><div class="css-tvzngu"><button class="chakra-stack css-1htazvk" data-group="false"><span>Custom</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/integrations/plugins"><span class="css-70qvj9">Creating plugins<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/integrations/plugins-event-reference"><span class="css-70qvj9">Event reference<!-- --> </span></a></div></div></div></div></div></div><div class="css-1a88wtd"><button class="chakra-stack css-1htazvk" data-group="false"><span>Using with Federation</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><div class="css-tvzngu"><button class="chakra-stack css-1htazvk" data-group="false"><span>As a subgraph</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/using-federation/apollo-subgraph-setup"><span class="css-70qvj9">Setup<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/using-federation/api/apollo-subgraph/"><span class="css-70qvj9">@apollo/subgraph reference<!-- --> </span></a></div></div></div><div class="css-tvzngu"><button class="chakra-stack css-1htazvk" data-group="false"><span>As a gateway</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4 6l4 4 4-4"/></svg></button><div class="chakra-collapse" style="overflow:hidden;display:block;opacity:1;height:auto"><div class="chakra-stack css-7rklk1"><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/using-federation/apollo-gateway-setup"><span class="css-70qvj9">Setup<!-- --> </span></a><a class="chakra-button css-34b800" data-depth="2" href="/docs/apollo-server/using-federation/api/apollo-gateway/"><span class="css-70qvj9">@apollo/gateway reference<!-- --> </span></a></div></div></div></div></div></div></div></nav><style data-emotion="css 1894d3k">.css-1894d3k{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:auto;position:-webkit-sticky;position:sticky;bottom:0px;padding-left:var(--chakra-space-4);padding-right:var(--chakra-space-2);background:var(--chakra-colors-bg);border-top-width:1px;height:56px;}</style><div class="css-1894d3k"><style data-emotion="css 1hszhjx">.css-1hszhjx{font-weight:var(--chakra-fontWeights-semibold);font-size:var(--chakra-fontSizes-sm);}</style><span class="css-1hszhjx">Navigation controls</span><style data-emotion="css 5jwabm">.css-5jwabm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-left:auto;}.css-5jwabm>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:var(--chakra-space-1);margin-inline-start:var(--chakra-space-1);}</style><div class="chakra-stack css-5jwabm"><div><style data-emotion="css 13n25ad">.css-13n25ad{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-8);min-width:var(--chakra-sizes-8);font-size:var(--chakra-fontSizes-sm);-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);color:inherit;padding:0px;}.css-13n25ad:focus,.css-13n25ad[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-13n25ad[disabled],.css-13n25ad[aria-disabled=true],.css-13n25ad[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-13n25ad:hover,.css-13n25ad[data-hover]{background:var(--chakra-colors-gray-100);}.css-13n25ad:hover[disabled],.css-13n25ad[data-hover][disabled],.css-13n25ad:hover[aria-disabled=true],.css-13n25ad[data-hover][aria-disabled=true],.css-13n25ad:hover[data-disabled],.css-13n25ad[data-hover][data-disabled]{background:initial;}.css-13n25ad:active,.css-13n25ad[data-active]{background:var(--chakra-colors-gray-200);}</style><button type="button" class="chakra-button css-13n25ad" aria-label="Collapse all categories"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M11.333 2.667L8 6 4.667 2.667m6.666 10.666L8 10l-3.333 3.333"/></svg></button></div><div><button type="button" class="chakra-button css-13n25ad" aria-label="Hide navigation"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M7.333 4l-4 4 4 4m5.334-8l-4 4 4 4"/></svg></button></div><div><button type="button" class="chakra-button css-13n25ad" aria-label="Lock sidebar"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 16 16" class="css-1yue7os"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M.969 6.594V4.25a3.281 3.281 0 116.562 0v2.344m2.344 3.281v1.875M5.656 6.594h8.438s.937 0 .937.937v6.563s0 .937-.937.937H5.656s-.937 0-.937-.937V7.53s0-.937.937-.937"/></svg></button></div></div></div></div></div></aside><style data-emotion="css xrz0td">.css-xrz0td{margin-left:0px;transition-property:margin-left;transition-duration:var(--chakra-transition-duration-normal);}@media screen and (min-width: 48em){.css-xrz0td{margin-left:373px;}}</style><div class="css-xrz0td"><style data-emotion="css-global 1b67a9w">.mermaid{line-height:normal;}.mermaid .node rect,.mermaid .node circle,.mermaid .node polygon,.mermaid .node path{stroke-width:2!important;stroke:#276749!important;fill:#ebf8ff!important;}.mermaid .CircleSize50>circle{r:50!important;}.mermaid .node.secondary rect,.mermaid .node.secondary circle,.mermaid .node.secondary polygon,.mermaid .node.tertiary rect,.mermaid .node.tertiary circle,.mermaid .node.tertiary polygon{fill:var(--chakra-colors-bg)!important;}.mermaid .node.secondary rect,.mermaid .node.secondary circle,.mermaid .node.secondary polygon{stroke:#7D6800!important;}.mermaid .cluster rect,.mermaid .node.tertiary rect,.mermaid .node.tertiary circle,.mermaid .node.tertiary polygon{stroke:#59301D!important;}.mermaid .cluster rect{fill:none!important;stroke-width:2!important;}.mermaid .label,.mermaid .edgeLabel{background:var(--chakra-colors-bg)!important;line-height:1.15!important;color:inherit!important;}.mermaid .edgeLabel rect{background:none!important;fill:none!important;}.mermaid .messageText,.mermaid .noteText,.mermaid .labelText,.mermaid .loopText,.mermaid .loopText>tspan{fill:currentColor!important;stroke:none!important;}.mermaid g rect,.mermaid polygon.labelBox{stroke-width:2!important;}.mermaid g rect.actor{stroke:#59301D!important;fill:var(--chakra-colors-bg)!important;}.mermaid g rect.note{stroke:#7D6800!important;fill:var(--chakra-colors-bg)!important;}.mermaid g line.loopLine,.mermaid polygon.labelBox{stroke:#276749!important;fill:var(--chakra-colors-bg)!important;}.mermaid g line,.mermaid svg>line{stroke:#59301D!important;}.mermaid .actor-man line,.mermaid .actor-man circle{stroke:#59301D!important;fill:var(--chakra-colors-bg)!important;}.mermaid .label text,.mermaid span{color:inherit!important;fill:currentColor!important;}.mermaid .edgePath .path,.mermaid .flowchart-link,.mermaid .messageLine0,.mermaid .messageLine1{stroke:currentColor!important;}.mermaid .marker,.mermaid #arrowhead path{stroke:currentColor!important;fill:currentColor!important;}.mermaid .cluster-label{line-height:1.6em!important;}.mermaid .arrowheadPath{fill:currentColor!important;}.mermaid .noteText tspan,.mermaid text.actor tspan{fill:currentColor!important;}.mermaid .label foreignObject,.mermaid .cluster-label foreignObject{overflow:visible!important;}.mermaid *{font-family:trebuchet ms,verdana,arial,sans-serif!important;}</style><style data-emotion="css-global 1poml3x">.responsive-grid .row{-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:0;grid-column-end:-1;}.responsive-grid details{display:contents;}.responsive-grid .first.cell{-ms-grid-column:1;grid-column-start:1;}.responsive-grid .cell{-ms-grid-column-span:1;grid-column-end:span 1;}.responsive-grid details .cell{-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:0;grid-column-end:-1;}.responsive-grid{background:var(--chakra-colors-border);gap:1px;}.responsive-grid>*,.responsive-grid>details>*{background:var(--chakra-colors-bg);}.responsive-grid .cell,.responsive-grid .row{padding:var(--chakra-space-4);}.responsive-grid details .first.cell+.cell{margin-top:-1px;padding-top:0;}.responsive-grid details h6{display:inline;}.responsive-grid .heading{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-normal);text-transform:uppercase;letter-spacing:var(--chakra-letterSpacings-wider);font-size:var(--chakra-fontSizes-xs);}</style><style data-emotion="css 189cttg">.css-189cttg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;max-width:var(--docs-page-width);-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-padding-start:var(--chakra-space-6);padding-inline-start:var(--chakra-space-6);-webkit-padding-end:var(--chakra-space-6);padding-inline-end:var(--chakra-space-6);padding-top:40px;padding-bottom:48px;}@media screen and (min-width: 48em){.css-189cttg{-webkit-padding-start:var(--chakra-space-10);padding-inline-start:var(--chakra-space-10);-webkit-padding-end:var(--chakra-space-10);padding-inline-end:var(--chakra-space-10);}}</style><main class="css-189cttg"><style data-emotion="css j4wukh">.css-j4wukh{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;width:0;}</style><div class="css-j4wukh"><style data-emotion="css 1agee8u">.css-1agee8u{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-medium);font-size:var(--chakra-fontSizes-4xl);line-height:1.2;}@media screen and (min-width: 48em){.css-1agee8u{font-size:var(--chakra-fontSizes-5xl);line-height:1;}}</style><h1 class="chakra-heading css-1agee8u">API Reference: ApolloServer</h1><style data-emotion="css ele70p">.css-ele70p{opacity:0.6;border:0;border-color:inherit;border-style:solid;border-bottom-width:1px;width:100%;margin-top:var(--chakra-space-8);margin-bottom:var(--chakra-space-8);}</style><hr aria-orientation="horizontal" class="chakra-divider css-ele70p"/><style data-emotion="css 2jon2v">@media screen and (min-width: 48em){.css-2jon2v{font-size:var(--chakra-fontSizes-md);line-height:1.5;}}.css-2jon2v h1 a,.css-2jon2v h2 a,.css-2jon2v h3 a,.css-2jon2v h4 a,.css-2jon2v h5 a,.css-2jon2v h6 a{color:inherit;}.css-2jon2v h1 code,.css-2jon2v h2 code,.css-2jon2v h3 code,.css-2jon2v h4 code,.css-2jon2v h5 code,.css-2jon2v h6 code{background:none;padding:0px;color:var(--chakra-colors-tertiary);white-space:normal;}.css-2jon2v >:not(:last-child){margin-bottom:var(--chakra-space-6);}.css-2jon2v >:not(style:first-child)+ h1,.css-2jon2v >:not(style:first-child)+ h2,.css-2jon2v >:not(style:first-child)+ h3,.css-2jon2v >:not(style:first-child)+ h4,.css-2jon2v >:not(style:first-child)+ h5,.css-2jon2v >:not(style:first-child)+ h6{margin-top:var(--chakra-space-10);margin-bottom:var(--chakra-space-4);}.css-2jon2v img.screenshot{box-shadow:var(--chakra-shadows-md);border-radius:var(--chakra-radii-md);}.chakra-ui-dark .css-2jon2v img.screenshot:not([data-theme]),[data-theme=dark] .css-2jon2v img.screenshot:not([data-theme]),.css-2jon2v img.screenshot[data-theme=dark]{box-shadow:var(--chakra-shadows-dark-lg);}.css-2jon2v table td ul ul,.css-2jon2v table td ol ul,.css-2jon2v table td ul ol,.css-2jon2v table td ol ol{margin-top:var(--chakra-space-1);}.css-2jon2v table td ul li:not(:first-child),.css-2jon2v table td ol li:not(:first-child){margin-top:var(--chakra-space-1);}.css-2jon2v .field-table tr.required{background:var(--chakra-colors-blackAlpha-50);}.css-2jon2v .field-table td:first-child h5,.css-2jon2v .field-table td:first-child h6{margin-bottom:var(--chakra-space-1);font-size:var(--chakra-fontSizes-md);font-weight:var(--chakra-fontWeights-normal);}.css-2jon2v .field-table td:first-child p{font-size:var(--chakra-fontSizes-sm);}.css-2jon2v .field-table td:first-child p code{padding:0px;background:none;color:var(--chakra-colors-teal-600);}.css-2jon2v .field-table td:first-child code{font-size:inherit;}.css-2jon2v .field-table td:not(:first-child){line-height:var(--chakra-lineHeights-base);font-size:var(--chakra-fontSizes-md);}.css-2jon2v .field-table td:not(:first-child) p:not(:last-child){margin-bottom:var(--chakra-space-2);}.css-2jon2v .sticky-table{box-shadow:var(--chakra-shadows-inner);}.css-2jon2v .sticky-table table td:first-of-type,.css-2jon2v .sticky-table table th:first-of-type{position:-webkit-sticky;position:sticky;left:0px;background:var(--chakra-colors-bg);border-right-width:1px;}.css-2jon2v .sticky-table table tr:last-child td{border-bottom:var(--chakra-borders-none);}.css-2jon2v h1,.css-2jon2v h2,.css-2jon2v h3,.css-2jon2v h4,.css-2jon2v h5,.css-2jon2v h6,.css-2jon2v p{scroll-snap-margin-top:101px;scroll-margin-top:101px;}</style><div class="css-2jon2v"><style data-emotion="css 5le3e4">.css-5le3e4{line-height:1.5rem;}</style><p class="chakra-text css-5le3e4"><span><span class="">This article </span><style data-emotion="css 154yii">.css-154yii{-webkit-text-decoration:underline;text-decoration:underline;text-decoration-style:dotted;text-decoration-thickness:1.5px;text-decoration-color:var(--chakra-colors-gray-300);text-underline-offset:0.2em;}.css-154yii:hover,.css-154yii[data-hover]{cursor:help;}.chakra-ui-dark .css-154yii:not([data-theme]),[data-theme=dark] .css-154yii:not([data-theme]),.css-154yii[data-theme=dark]{text-decoration-color:var(--chakra-colors-blue-400);}</style><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">documents</span><span/><span class=""> the </span></span><style data-emotion="css 1lvdtfu">.css-1lvdtfu{font-family:var(--chakra-fonts-mono);font-size:calc(1em / 1.125);-webkit-padding-start:var(--chakra-space-1);padding-inline-start:var(--chakra-space-1);-webkit-padding-end:var(--chakra-space-1);padding-inline-end:var(--chakra-space-1);padding-top:var(--chakra-space-0-5);padding-bottom:var(--chakra-space-0-5);border-radius:var(--chakra-radii-sm);color:var(--chakra-colors-text);background-color:var(--chakra-colors-silver-400);}.chakra-ui-dark .css-1lvdtfu:not([data-theme]),[data-theme=dark] .css-1lvdtfu:not([data-theme]),.css-1lvdtfu[data-theme=dark]{background-color:var(--chakra-colors-black-200);}</style><code class="css-1lvdtfu">ApolloServer</code><span><span class=""> class from the </span></span><code class="css-1lvdtfu">@apollo/server</code><span><span class=""> package. You can use the </span></span><code class="css-1lvdtfu">ApolloServer</code><span><span class=""> class to create an instance of </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> that you can then pass to a web framework integration function (e.g., </span></span><code class="css-1lvdtfu">startStandaloneServer</code><span><span class=""> or </span></span><code class="css-1lvdtfu">expressMiddleware</code><span><span class="">).</span></span></p><style data-emotion="css 11imr2v">.css-11imr2v{padding-left:var(--chakra-space-4);padding-top:var(--chakra-space-1);padding-bottom:var(--chakra-space-1);border-left-width:2px;border-color:var(--chakra-colors-primary);}.css-11imr2v >:not(:last-child){margin-bottom:var(--chakra-space-2);}</style><div class="css-11imr2v"><p class="chakra-text css-5le3e4"><span><span class="">Check out our </span></span><style data-emotion="css d0tiql">.css-d0tiql{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:var(--chakra-colors-tertiary);font-weight:var(--chakra-fontWeights-medium);}.css-d0tiql:hover,.css-d0tiql[data-hover]{color:var(--chakra-colors-link);}.css-d0tiql:focus,.css-d0tiql[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-d0tiql code{color:inherit;}</style><a class="chakra-link css-d0tiql" href="/docs/apollo-server/getting-started">Getting Started</a><span><span class=""> guide for an example of setting up </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class="">!</span></span></p></div><style data-emotion="css 1vu0ieg">.css-1vu0ieg{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-medium);font-size:var(--chakra-fontSizes-3xl);line-height:1.33;}@media screen and (min-width: 48em){.css-1vu0ieg{font-size:var(--chakra-fontSizes-4xl);line-height:1.2;}}</style><h2 class="chakra-heading css-1vu0ieg" id="constructor"><span><a class="chakra-link css-d0tiql" href="#constructor"><code class="css-1lvdtfu">constructor</code></a></span></h2><p class="chakra-text css-5le3e4"><span><span class="">Returns an initialized </span></span><code class="css-1lvdtfu">ApolloServer</code><span><span class=""> instance.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">Takes an </span></span><code class="css-1lvdtfu">options</code><span><span class=""> object as a parameter. Supported </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">fields</span><span/><span class=""> of this object are described below.</span></span></p><style data-emotion="css z257o5">.css-z257o5{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-medium);font-size:var(--chakra-fontSizes-2xl);line-height:1.33;}@media screen and (min-width: 48em){.css-z257o5{font-size:var(--chakra-fontSizes-3xl);line-height:1.2;}}</style><h3 class="chakra-heading css-z257o5" id="example"><span><a class="chakra-link css-d0tiql" href="#example">Example</a></span></h3><style data-emotion="css v656ao">.css-v656ao{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-top:var(--chakra-space-6);}</style><div class="css-v656ao"><style data-emotion="css 1ni5vfl">.css-1ni5vfl{position:relative;padding-top:var(--chakra-space-1);z-index:0;}</style><div class="css-1ni5vfl"><style data-emotion="css wgjz4w">.css-wgjz4w{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;left:-1px;top:0px;bottom:0px;z-index:99;width:var(--chakra-sizes-8);background:linear-gradient(90deg,rgb(255, 255, 255) 50%,rgba(255, 255, 255, 0));opacity:0;pointer-events:none;-webkit-transition:all 250ms ease-in-out;transition:all 250ms ease-in-out;cursor:pointer;}</style><div class="css-wgjz4w"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewbox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11.354 1.646a.5.5 0 010 .708L5.707 8l5.647 5.646a.5.5 0 01-.708.708l-6-6a.5.5 0 010-.708l6-6a.5.5 0 01.708 0z" clip-rule="evenodd"/></svg></div><style data-emotion="css 6wb6l1">.css-6wb6l1{overflow-x:auto;position:relative;-ms-overflow-style:none;scrollbar-width:none;}.css-6wb6l1::-webkit-scrollbar{;}</style><div class="css-6wb6l1"><style data-emotion="css 9ahm8">.css-9ahm8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:-webkit-max-content;width:-moz-max-content;width:max-content;}.css-9ahm8>*:not(style)~*:not(style){-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}</style><div role="tablist" class="chakra-button__group css-9ahm8"><style data-emotion="css 18pfcca">.css-18pfcca{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-6);min-width:var(--chakra-sizes-6);font-size:var(--chakra-fontSizes-xs);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);background:var(--chakra-colors-gray-100);border-bottom-left-radius:var(--chakra-radii-none);border-bottom-right-radius:var(--chakra-radii-none);margin-top:var(--chakra-space-1);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-18pfcca:focus,.css-18pfcca[data-focus]{box-shadow:var(--chakra-shadows-outline);z-index:1;}.css-18pfcca[disabled],.css-18pfcca[aria-disabled=true],.css-18pfcca[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-18pfcca:hover,.css-18pfcca[data-hover]{background:var(--chakra-colors-gray-200);}.css-18pfcca:hover[disabled],.css-18pfcca[data-hover][disabled],.css-18pfcca:hover[aria-disabled=true],.css-18pfcca[data-hover][aria-disabled=true],.css-18pfcca:hover[data-disabled],.css-18pfcca[data-hover][data-disabled]{background:var(--chakra-colors-gray-100);}.css-18pfcca:active,.css-18pfcca[data-active]{background:var(--chakra-colors-gray-300);}</style><button type="button" class="chakra-button css-18pfcca" role="tab" aria-selected="true"><style data-emotion="css 1wh2kri">.css-1wh2kri{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-margin-end:0.5rem;margin-inline-end:0.5rem;}</style><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="currentColor" stroke-width="0" role="img" viewbox="0 0 24 24" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><title/><path d="M0 12v12h24V0H0zm19.341-.956c.61.152 1.074.423 1.501.865.221.236.549.666.575.77.008.03-1.036.73-1.668 1.123-.023.015-.115-.084-.217-.236-.31-.45-.633-.644-1.128-.678-.728-.05-1.196.331-1.192.967a.88.88 0 0 0 .102.45c.16.331.458.53 1.39.933 1.719.74 2.454 1.227 2.911 1.92.51.773.625 2.008.278 2.926-.38.998-1.325 1.676-2.655 1.9-.411.073-1.386.062-1.828-.018-.964-.172-1.878-.648-2.442-1.273-.221-.243-.652-.88-.625-.925.011-.016.11-.077.22-.141.108-.061.511-.294.892-.515l.69-.4.145.214c.202.308.643.731.91.872.766.404 1.817.347 2.335-.118a.883.883 0 0 0 .313-.72c0-.278-.035-.4-.18-.61-.186-.266-.567-.49-1.649-.96-1.238-.533-1.771-.864-2.259-1.39a3.165 3.165 0 0 1-.659-1.2c-.091-.339-.114-1.189-.042-1.531.255-1.197 1.158-2.03 2.461-2.278.423-.08 1.406-.05 1.821.053zm-5.634 1.002l.008.983H10.59v8.876H8.38v-8.876H5.258v-.964c0-.534.011-.98.026-.99.012-.016 1.913-.024 4.217-.02l4.195.012z"/></svg></span>TypeScript</button><style data-emotion="css ewqrg1">.css-ewqrg1{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-6);min-width:var(--chakra-sizes-6);font-size:var(--chakra-fontSizes-xs);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);background:#F2F4F4;border-bottom-left-radius:var(--chakra-radii-none);border-bottom-right-radius:var(--chakra-radii-none);margin-top:var(--chakra-space-1);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-ewqrg1:focus,.css-ewqrg1[data-focus]{box-shadow:var(--chakra-shadows-outline);z-index:1;}.css-ewqrg1[disabled],.css-ewqrg1[aria-disabled=true],.css-ewqrg1[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-ewqrg1:hover,.css-ewqrg1[data-hover]{background:var(--chakra-colors-gray-200);}.css-ewqrg1:hover[disabled],.css-ewqrg1[data-hover][disabled],.css-ewqrg1:hover[aria-disabled=true],.css-ewqrg1[data-hover][aria-disabled=true],.css-ewqrg1:hover[data-disabled],.css-ewqrg1[data-hover][data-disabled]{background:var(--chakra-colors-gray-100);}.css-ewqrg1:active,.css-ewqrg1[data-active]{background:var(--chakra-colors-gray-300);}</style><button type="button" class="chakra-button css-ewqrg1" role="tab" aria-selected="true"><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="currentColor" stroke-width="0" role="img" viewbox="0 0 24 24" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><title/><path d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"/></svg></span>JavaScript</button></div></div><style data-emotion="css d0etnw">.css-d0etnw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;right:-1px;top:0px;bottom:0px;z-index:99;width:var(--chakra-sizes-8);background:linear-gradient(270deg,rgb(255, 255, 255) 50%,rgba(255, 255, 255, 0));opacity:0;pointer-events:none;-webkit-transition:all 250ms ease-in-out;transition:all 250ms ease-in-out;cursor:pointer;}</style><div class="css-d0etnw"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewbox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 01.708 0l6 6a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708L10.293 8 4.646 2.354a.5.5 0 010-.708z" clip-rule="evenodd"/></svg></div></div><style data-emotion="css 13o7eu2">.css-13o7eu2{display:block;}</style><div role="tabpanel" tabindex="0" class="css-13o7eu2"><div class="css-0"><style data-emotion="css 10uovtp">.css-10uovtp{border-radius:var(--chakra-radii-md);border-top-left-radius:var(--chakra-radii-none);border-top-right-radius:var(--chakra-radii-none);position:relative;border-width:1px;line-height:var(--chakra-lineHeights-base);}</style><div style="color:currentColor;background-color:#F2F4F4" class="css-10uovtp"><style data-emotion="css 1lxjm3p">.css-1lxjm3p{font-size:var(--chakra-fontSizes-md);font-family:var(--chakra-fonts-mono);}</style><div class="css-1lxjm3p"><style data-emotion="css 1i3wzr">.css-1i3wzr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:auto;-webkit-transition:filter 200ms;transition:filter 200ms;}</style><div class="css-1i3wzr"><style data-emotion="css inwjey">.css-inwjey{display:inline-block;min-width:var(--chakra-sizes-full);padding-top:var(--chakra-space-4);padding-bottom:var(--chakra-space-4);font-family:inherit;}</style><pre class="prism-code language-ts css-inwjey"><style data-emotion="css j7glh4">.css-j7glh4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);min-width:var(--chakra-sizes-full);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}</style><div class="css-j7glh4"><style data-emotion="css dacbbu">.css-dacbbu{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:right;width:1ch;margin-right:var(--chakra-space-4);color:var(--chakra-colors-gray-500);}</style><div aria-hidden="true" class="css-dacbbu">1</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token keyword" style="color:#005AAF;background:transparent">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"> ApolloServer </span><span class="token punctuation" style="color:#546461">}</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">from</span><span class="token plain"> </span><span class="token string" style="color:#B03900">'@apollo/server'</span><span class="token punctuation" style="color:#546461">;</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">2</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain" style="display:inline-block"> </span></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">3</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token keyword" style="color:#005AAF;background:transparent">const</span><span class="token plain"> server </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">new</span><span class="token plain"> </span><span class="token class-name" style="color:#546461">ApolloServer</span><span class="token punctuation" style="color:#546461">(</span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">4</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> typeDefs</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">5</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> resolvers</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">6</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token punctuation" style="color:#546461">}</span><span class="token punctuation" style="color:#546461">)</span><span class="token punctuation" style="color:#546461">;</span></div></div></div></pre></div></div><style data-emotion="css 1paqdtk">.css-1paqdtk{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;top:var(--chakra-space-2);right:var(--chakra-space-2);-webkit-transition:opacity 200ms linear 200ms;transition:opacity 200ms linear 200ms;}.css-1paqdtk>*:not(style)~*:not(style){-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;}</style><div role="group" class="chakra-button__group css-1paqdtk"><style data-emotion="css 151dby9">.css-151dby9{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-semibold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:var(--chakra-sizes-6);min-width:var(--chakra-sizes-6);font-size:var(--chakra-fontSizes-xs);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);background:var(--chakra-colors-gray-100);}.css-151dby9:focus,.css-151dby9[data-focus]{box-shadow:var(--chakra-shadows-outline);z-index:1;}.css-151dby9[disabled],.css-151dby9[aria-disabled=true],.css-151dby9[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-151dby9:hover,.css-151dby9[data-hover]{background:var(--chakra-colors-gray-200);}.css-151dby9:hover[disabled],.css-151dby9[data-hover][disabled],.css-151dby9:hover[aria-disabled=true],.css-151dby9[data-hover][aria-disabled=true],.css-151dby9:hover[data-disabled],.css-151dby9[data-hover][data-disabled]{background:var(--chakra-colors-gray-100);}.css-151dby9:active,.css-151dby9[data-active]{background:var(--chakra-colors-gray-300);}</style><button type="button" class="chakra-button css-151dby9"><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="none" stroke-width="2" viewbox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><rect x="8" y="2" width="8" height="4" rx="1" ry="1"/></svg></span>Copy</button></div></div></div></div><style data-emotion="css 1hyfx7x">.css-1hyfx7x{;}</style><div role="tabpanel" tabindex="0" class="css-1hyfx7x"><div class="css-0"><div style="color:currentColor;background-color:#F2F4F4" class="css-10uovtp"><div class="css-1lxjm3p"><div class="css-1i3wzr"><pre class="prism-code language-js css-inwjey"><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">1</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token keyword" style="color:#005AAF;background:transparent">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"> ApolloServer </span><span class="token punctuation" style="color:#546461">}</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">from</span><span class="token plain"> </span><span class="token string" style="color:#B03900">'@apollo/server'</span><span class="token punctuation" style="color:#546461">;</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">2</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain" style="display:inline-block"> </span></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">3</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token keyword" style="color:#005AAF;background:transparent">const</span><span class="token plain"> server </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">new</span><span class="token plain"> </span><span class="token class-name" style="color:#546461">ApolloServer</span><span class="token punctuation" style="color:#546461">(</span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">4</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> typeDefs</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">5</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> resolvers</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-dacbbu">6</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token punctuation" style="color:#546461">}</span><span class="token punctuation" style="color:#546461">)</span><span class="token punctuation" style="color:#546461">;</span></div></div></div></pre></div></div><div role="group" class="chakra-button__group css-1paqdtk"><button type="button" class="chakra-button css-151dby9"><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="none" stroke-width="2" viewbox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><rect x="8" y="2" width="8" height="4" rx="1" ry="1"/></svg></span>Copy</button></div></div></div></div></div><h3 class="chakra-heading css-z257o5" id="options"><span><a class="chakra-link css-d0tiql" href="#options">Options</a></span></h3><style data-emotion="css ddf0z6">.css-ddf0z6{border-radius:4px;border-width:1px;overflow:auto;}.css-ddf0z6 table{border-width:0;}</style><div class="css-ddf0z6"><style data-emotion="css 1oh6xax">.css-1oh6xax{font-variant-numeric:lining-nums tabular-nums;border-collapse:separate;width:var(--chakra-sizes-full);border-spacing:0;border-width:1px;border-radius:var(--chakra-radii-md);}</style><table role="table" class="chakra-table field-table css-1oh6xax"><thead class="css-0"><tr role="row" class="css-0"><style data-emotion="css dcorm2">.css-dcorm2{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-normal);text-transform:uppercase;letter-spacing:var(--chakra-letterSpacings-wider);text-align:start;-webkit-padding-start:var(--chakra-space-6);padding-inline-start:var(--chakra-space-6);-webkit-padding-end:var(--chakra-space-6);padding-inline-end:var(--chakra-space-6);padding-top:var(--chakra-space-3);padding-bottom:var(--chakra-space-3);line-height:var(--chakra-lineHeights-4);font-size:var(--chakra-fontSizes-xs);color:var(--chakra-colors-gray-600);border-bottom:var(--chakra-borders-1px);border-color:var(--chakra-colors-gray-100);}.css-dcorm2[data-is-numeric=true]{text-align:end;}</style><th class="css-dcorm2">Name /<br/>Type</th><th class="css-dcorm2">Description</th></tr></thead><tbody class="css-0"><tr role="row" class="css-0"><style data-emotion="css hiju5f">.css-hiju5f{text-align:start;-webkit-padding-start:var(--chakra-space-6);padding-inline-start:var(--chakra-space-6);-webkit-padding-end:var(--chakra-space-6);padding-inline-end:var(--chakra-space-6);padding-top:var(--chakra-space-4);padding-bottom:var(--chakra-space-4);line-height:var(--chakra-lineHeights-5);border-bottom:var(--chakra-borders-1px);border-color:var(--chakra-colors-gray-100);font-size:var(--chakra-fontSizes-md);}.css-hiju5f[data-is-numeric=true]{text-align:end;}</style><td role="gridcell" colspan="2" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Specifying a schema</strong></p></td></tr><tr role="row" class="required css-0"><td role="gridcell" class="css-hiju5f"><style data-emotion="css 1pm5o6a">.css-1pm5o6a{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-medium);font-size:var(--chakra-fontSizes-sm);line-height:1.2;}</style><h6 class="chakra-heading css-1pm5o6a" id="typedefs"><span><a class="chakra-link css-d0tiql" href="#typedefs"><code class="css-1lvdtfu">typeDefs</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">string</code><span><span class="">, </span></span><code class="css-1lvdtfu">DocumentNode</code><span><span class="">, or </span></span><code class="css-1lvdtfu">Array<DocumentNode></code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A valid </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/schema/schema/#the-schema-definition-language">Schema Definition Language</a><span><span class=""> (</span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">SDL</span><span/><span class="">) string, </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">document</span><span/><span class="">, or documents that represent your server's </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL schema</span><span/><span class="">. To generate documents, you can apply the </span></span><code class="css-1lvdtfu">gql</code><span><span class=""> tag (from </span></span><style data-emotion="css yczznh">.css-yczznh{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:baseline;outline:2px solid transparent;outline-offset:2px;width:auto;line-height:var(--chakra-lineHeights-normal);border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-medium);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);height:auto;min-width:var(--chakra-sizes-10);font-size:inherit;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding:0px;color:var(--chakra-colors-tertiary);margin-right:5px;}.css-yczznh:focus,.css-yczznh[data-focus]{box-shadow:var(--chakra-shadows-outline);}.css-yczznh[disabled],.css-yczznh[aria-disabled=true],.css-yczznh[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-yczznh:hover,.css-yczznh[data-hover]{color:var(--chakra-colors-link);}.css-yczznh:active,.css-yczznh[data-active]{color:var(--chakra-colors-gray-700);}.css-yczznh code{color:inherit;}</style><a class="chakra-button css-yczznh" href="https://www.npmjs.com/package/graphql-tag" target="_blank"><code class="css-1lvdtfu">graphql-tag</code><style data-emotion="css 1d409bm">.css-1d409bm{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-margin-start:5px;margin-inline-start:5px;}</style><span class="chakra-button__icon css-1d409bm"><style data-emotion="css 1v7h6gm">.css-1v7h6gm{width:0.75em;height:0.75em;fill:none;}</style><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class="">) to valid </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">SDL</span><span/><span class=""> strings.</span></span></p><p class="chakra-text css-5le3e4"><strong>Required</strong><span><span class=""> unless you provide a </span></span><a class="chakra-link css-d0tiql" href="#schema"><code class="css-1lvdtfu">schema</code></a><span><span class=""> or a </span></span><a class="chakra-link css-d0tiql" href="#gateway"><code class="css-1lvdtfu">gateway</code></a><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">For an example, see </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/getting-started/#step-3-define-your-graphql-schema">Define your GraphQL schema</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="required css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="resolvers"><span><a class="chakra-link css-d0tiql" href="#resolvers"><code class="css-1lvdtfu">resolvers</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code><span><span class=""> or </span></span><code class="css-1lvdtfu">Array</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A map of functions that populate data for individual schema </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">fields</span><span/><span class="">. Can also be an array of multiple maps that are merged.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">While technically optional, if you are providing </span></span><code class="css-1lvdtfu">typeDefs</code><span><span class="">, it is strongly recommended that you provide </span></span><code class="css-1lvdtfu">resolvers</code><span><span class=""> as well.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">For details, see </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/data/resolvers">Resolvers</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="schema"><span><a class="chakra-link css-d0tiql" href="#schema"><code class="css-1lvdtfu">schema</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An executable </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL schema</span><span/><span class="">. Under the hood, </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> automatically generates this </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">field</span><span/><span class=""> from </span></span><a class="chakra-link css-d0tiql" href="#typedefs"><code class="css-1lvdtfu">typeDefs</code></a><span><span class=""> and </span></span><a class="chakra-link css-d0tiql" href="#resolvers"><code class="css-1lvdtfu">resolvers</code></a><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">This </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">field</span><span/><span class=""> is helpful if:</span></span></p><style data-emotion="css 1d1yeyq">.css-1d1yeyq{list-style-type:initial;-webkit-margin-start:1em;margin-inline-start:1em;}.css-1d1yeyq>*:not(style)~*:not(style){margin-top:var(--chakra-space-4);}.css-1d1yeyq ul,.css-1d1yeyq ol{margin-top:var(--chakra-space-3);}.css-1d1yeyq ul{list-style-type:circle;}</style><ul role="list" class="css-1d1yeyq"><li class="css-0"><span><span class="">You are </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/using-federation/apollo-subgraph-setup">building a subgraph for Apollo Federation</a><span><span class="">, which uses the </span></span><code class="css-1lvdtfu">buildSubgraphSchema</code><span><span class=""> function to generate its schema</span></span></li><li class="css-0"><span><span class="">You are using a function like </span></span><code class="css-1lvdtfu">makeExecutableSchema</code><span><span class=""> from </span></span><a class="chakra-button css-yczznh" href="https://www.graphql-tools.com/docs/generate-schema" target="_blank"><code class="css-1lvdtfu">graphql-tools</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> to create your schema</span></span></li><li class="css-0"><span><span class="">You are using a library that takes a code-first approach (i.e., instead of a schema-first approach) to generate a schema</span></span></li></ul></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="gateway"><span><a class="chakra-link css-d0tiql" href="#gateway"><code class="css-1lvdtfu">gateway</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">You can use this </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">field</span><span/><span class=""> to integrate your server with </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/using-federation/api/apollo-gateway">Apollo Gateway</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" colspan="2" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Schema options</strong></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="introspection"><span><a class="chakra-link css-d0tiql" href="#introspection"><code class="css-1lvdtfu">introspection</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">If </span></span><code class="css-1lvdtfu">true</code><span><span class="">, enables </span></span><a class="chakra-button css-yczznh" href="https://graphql.org/learn/introspection/" target="_blank">schema introspection<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> by clients. This is required to use tools that figure out your server's schema from talking to it directly, like </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Sandbox</span><span/><span class=""> and </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> Playground. (It's not needed for the non-Sandbox version of Apollo Studio Explorer, which uses the schema published in the Studio schema registry instead.)</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">The default value is </span></span><code class="css-1lvdtfu">true</code><span><span class="">, </span></span><strong>unless</strong><span><span class=""> the </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> environment variable is set to </span></span><code class="css-1lvdtfu">production</code><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="fieldresolver"><span><a class="chakra-link css-d0tiql" href="#fieldresolver"><code class="css-1lvdtfu">fieldResolver</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">GraphQLFieldResolver</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A custom </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">resolver</span><span/><span class=""> that will replace </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class="">'s </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/data/resolvers/#default-resolvers">default field resolvers</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="rootvalue"><span><a class="chakra-link css-d0tiql" href="#rootvalue"><code class="css-1lvdtfu">rootValue</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Any</code><span><span class=""> or </span></span><code class="css-1lvdtfu">Function</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A value or function called with the parsed </span></span><code class="css-1lvdtfu">Document</code><span><span class="">, creating the root value passed to the </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> executor.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">Providing a function is useful if you want to use a different root value depending on the </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class="">'s details, such as whether it's a </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">query</span><span/><span class=""> or </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">mutation</span><span/><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="validationrules"><span><a class="chakra-link css-d0tiql" href="#validationrules"><code class="css-1lvdtfu">validationRules</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Array<Function></code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An array containing custom functions to use as additional </span></span><a class="chakra-button css-yczznh" href="https://github.com/graphql/graphql-js/tree/master/src/validation/rules" target="_blank">validation rules<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> when validating </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class=""> against the schema. Note that these rules should depend only on the operation and the schema, not on anything else specific to an individual request, as the result of successful validation is cached across requests.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="documentstore"><span><a class="chakra-link css-d0tiql" href="#documentstore"><code class="css-1lvdtfu">documentStore</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">KeyValueCache<DocumentNode></code><span><span class=""> or </span></span><code class="css-1lvdtfu">null</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A key-value cache that </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> uses to store previously encountered </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class=""> (as </span></span><code class="css-1lvdtfu">DocumentNode</code><span><span class="">s). It does </span></span><em>not</em><span><span class=""> store </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">query</span><span/><span class=""> </span></span><em>results</em><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">Whenever </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> receives an incoming </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class="">, it checks whether that exact operation is present in its </span></span><code class="css-1lvdtfu">documentStore</code><span><span class="">. If it's present, </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> can safely skip parsing and validating the </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class="">, thereby improving performance.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">The default </span></span><code class="css-1lvdtfu">documentStore</code><span><span class=""> is an </span></span><a class="chakra-button css-yczznh" href="https://github.com/apollographql/apollo-utils/blob/main/packages/keyValueCache/src/InMemoryLRUCache.ts" target="_blank"><code class="css-1lvdtfu">InMemoryLRUCache</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> with an approximate size of 30MiB. This is usually sufficient unless the server processes a large number of unique </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class="">. Provide this option if you want to change the cache size or store the cache information in an alternate location.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">To use </span></span><code class="css-1lvdtfu">InMemoryLRUCache</code><span><span class=""> but change its size to an amount </span></span><code class="css-1lvdtfu">approximateDocumentStoreMiB</code><span><span class="">:</span></span></p><div style="max-width:400px"><div class="css-0"><div class="css-1ni5vfl"><div class="css-wgjz4w"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewbox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11.354 1.646a.5.5 0 010 .708L5.707 8l5.647 5.646a.5.5 0 01-.708.708l-6-6a.5.5 0 010-.708l6-6a.5.5 0 01.708 0z" clip-rule="evenodd"/></svg></div><div class="css-6wb6l1"><div role="tablist" class="chakra-button__group css-9ahm8"><button type="button" class="chakra-button css-18pfcca" role="tab" aria-selected="true"><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="currentColor" stroke-width="0" role="img" viewbox="0 0 24 24" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><title/><path d="M0 12v12h24V0H0zm19.341-.956c.61.152 1.074.423 1.501.865.221.236.549.666.575.77.008.03-1.036.73-1.668 1.123-.023.015-.115-.084-.217-.236-.31-.45-.633-.644-1.128-.678-.728-.05-1.196.331-1.192.967a.88.88 0 0 0 .102.45c.16.331.458.53 1.39.933 1.719.74 2.454 1.227 2.911 1.92.51.773.625 2.008.278 2.926-.38.998-1.325 1.676-2.655 1.9-.411.073-1.386.062-1.828-.018-.964-.172-1.878-.648-2.442-1.273-.221-.243-.652-.88-.625-.925.011-.016.11-.077.22-.141.108-.061.511-.294.892-.515l.69-.4.145.214c.202.308.643.731.91.872.766.404 1.817.347 2.335-.118a.883.883 0 0 0 .313-.72c0-.278-.035-.4-.18-.61-.186-.266-.567-.49-1.649-.96-1.238-.533-1.771-.864-2.259-1.39a3.165 3.165 0 0 1-.659-1.2c-.091-.339-.114-1.189-.042-1.531.255-1.197 1.158-2.03 2.461-2.278.423-.08 1.406-.05 1.821.053zm-5.634 1.002l.008.983H10.59v8.876H8.38v-8.876H5.258v-.964c0-.534.011-.98.026-.99.012-.016 1.913-.024 4.217-.02l4.195.012z"/></svg></span>TypeScript</button></div></div><div class="css-d0etnw"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewbox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 01.708 0l6 6a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708L10.293 8 4.646 2.354a.5.5 0 010-.708z" clip-rule="evenodd"/></svg></div></div><div style="color:currentColor;background-color:#F2F4F4" class="css-10uovtp"><div class="css-1lxjm3p"><div class="css-1i3wzr"><pre class="prism-code language-typescript css-inwjey"><div class="css-j7glh4"><style data-emotion="css 1meauqw">.css-1meauqw{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:right;width:2ch;margin-right:var(--chakra-space-4);color:var(--chakra-colors-gray-500);}</style><div aria-hidden="true" class="css-1meauqw">1</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token keyword" style="color:#005AAF;background:transparent">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"> InMemoryLRUCache </span><span class="token punctuation" style="color:#546461">}</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">from</span><span class="token plain"> </span><span class="token string" style="color:#B03900">'@apollo/utils.keyvaluecache'</span><span class="token punctuation" style="color:#546461">;</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">2</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token keyword" style="color:#005AAF;background:transparent">import</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"> DocumentNode </span><span class="token punctuation" style="color:#546461">}</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">from</span><span class="token plain"> </span><span class="token string" style="color:#B03900">'graphql'</span><span class="token punctuation" style="color:#546461">;</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">3</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain" style="display:inline-block"> </span></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">4</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token keyword" style="color:#005AAF;background:transparent">new</span><span class="token plain"> </span><span class="token class-name" style="color:#546461">ApolloServer</span><span class="token punctuation" style="color:#546461">(</span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">5</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> documentStore</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#005AAF;background:transparent">new</span><span class="token plain"> </span><span class="token class-name" style="color:#546461">InMemoryLRUCache</span><span class="token class-name operator" style="color:#546461"><</span><span class="token class-name" style="color:#546461">DocumentNode</span><span class="token class-name operator" style="color:#546461">></span><span class="token punctuation" style="color:#546461">(</span><span class="token punctuation" style="color:#546461">{</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">6</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> maxSize</span><span class="token operator">:</span><span class="token plain"> Math</span><span class="token punctuation" style="color:#546461">.</span><span class="token function" style="color:#22543D">pow</span><span class="token punctuation" style="color:#546461">(</span><span class="token number" style="color:#7B00C7">2</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"> </span><span class="token number" style="color:#7B00C7">20</span><span class="token punctuation" style="color:#546461">)</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> approximateDocumentStoreMiB</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">7</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> sizeCalculation</span><span class="token operator">:</span><span class="token plain"> InMemoryLRUCache</span><span class="token punctuation" style="color:#546461">.</span><span class="token plain">sizeCalculation</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">8</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> </span><span class="token punctuation" style="color:#546461">}</span><span class="token punctuation" style="color:#546461">)</span><span class="token punctuation" style="color:#546461">,</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">9</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"> </span><span class="token comment" style="color:#365E72;font-weight:bold">// ...</span><span class="token plain"/></div></div></div><div class="css-j7glh4"><div aria-hidden="true" class="css-1meauqw">10</div><div class="token-line css-0" style="color:currentColor"><div class="css-0"><span class="token plain"/><span class="token punctuation" style="color:#546461">}</span><span class="token punctuation" style="color:#546461">)</span><span class="token punctuation" style="color:#546461">;</span></div></div></div></pre></div></div><div role="group" class="chakra-button__group css-1paqdtk"><button type="button" class="chakra-button css-151dby9"><span class="chakra-button__icon css-1wh2kri"><svg stroke="currentColor" fill="none" stroke-width="2" viewbox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><rect x="8" y="2" width="8" height="4" rx="1" ry="1"/></svg></span>Copy</button></div></div></div></div><p class="chakra-text css-5le3e4"><span><span class="">Pass </span></span><code class="css-1lvdtfu">null</code><span><span class=""> to disable this cache entirely.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" colspan="2" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Protocol options</strong></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="persistedqueries"><span><a class="chakra-link css-d0tiql" href="#persistedqueries"><code class="css-1lvdtfu">persistedQueries</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code><span><span class=""> or </span></span><code class="css-1lvdtfu">false</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">If you're using </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/performance/apq">automated persisted queries (APQ)</a><span><span class="">, you can provide an object with </span></span><code class="css-1lvdtfu">cache</code><span><span class=""> and/or </span></span><code class="css-1lvdtfu">ttl</code><span><span class=""> </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">fields</span><span/><span class=""> to customize how </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> stores the mapping between </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class=""> hashes and </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">query</span><span/><span class=""> strings, or provide </span></span><code class="css-1lvdtfu">false</code><span><span class=""> to disable </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">APQ</span><span/><span class=""> entirely.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="csrfprevention"><span><a class="chakra-link css-d0tiql" href="#csrfprevention"><code class="css-1lvdtfu">csrfPrevention</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code><span><span class=""> or </span></span><code class="css-1lvdtfu">Object</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">By default, the </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/security/cors#preventing-cross-site-request-forgery-csrf">CSRF prevention</a><span><span class=""> feature is enabled to protect </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> from CSRF and XS-Search attacks.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">This feature can prevent certain </span></span><code class="css-1lvdtfu">GET</code><span><span class=""> requests from executing </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class=""> if those requests don't specify </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/security/cors/#why-use-cors">certain headers</a><span><span class="">. You can configure the headers that allow </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class=""> execution by passing a configuration object to this option (e.g., </span></span><code class="css-1lvdtfu">csrfPrevention: { requestHeaders: ['special-header'] }</code><span><span class="">).</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">If your server has clients that send </span></span><code class="css-1lvdtfu">GET</code><span><span class=""> requests and those clients </span></span><strong>aren't</strong><span><span class=""> one of Apollo's client libraries (Web, iOS, Kotlin), you might need to modify the configuration of those clients to use this feature. For more details, see </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/security/cors#preventing-cross-site-request-forgery-csrf">the CSRF prevention documentation</a><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">You can disable this recommended security feature by passing </span></span><code class="css-1lvdtfu">false</code><span><span class=""> to </span></span><code class="css-1lvdtfu">csrfPrevention</code><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="formaterror"><span><a class="chakra-link css-d0tiql" href="#formaterror"><code class="css-1lvdtfu">formatError</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Function</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">Provide this function to transform the structure of error objects before they're sent to a client.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">The </span></span><code class="css-1lvdtfu">formatError</code><span><span class=""> hook receives two </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">arguments</span><span/><span class="">: the first is a </span></span><a class="chakra-button css-yczznh" href="https://github.com/graphql/graphql-js/blob/29bf39faa670effd3c1561a1512ec7767658a63b/src/error/GraphQLError.ts#L215" target="_blank"><code class="css-1lvdtfu">GraphQLFormattedError</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> (to be sent with the response), and the second is the original error </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/data/errors/#for-client-responses">(wrapped in GraphQLError if thrown by a resolver)</a><span><span class="">. This function should return a </span></span><a class="chakra-button css-yczznh" href="https://github.com/graphql/graphql-js/blob/29bf39faa670effd3c1561a1512ec7767658a63b/src/error/GraphQLError.ts#L215" target="_blank"><code class="css-1lvdtfu">GraphQLFormattedError</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> object.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="apollo"><span><a class="chakra-link css-d0tiql" href="#apollo"><code class="css-1lvdtfu">apollo</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An object containing configuration options for connecting </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> to </span></span><a class="chakra-button css-yczznh" href="https://www.apollographql.com/docs/studio/" target="_blank">Apollo Studio<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class="">. Each </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">field</span><span/><span class=""> of this object can also be set with an environment variable, which is the recommended method of setting these parameters. All fields are optional. The fields are:</span></span></p><ul role="list" class="css-1d1yeyq"><li class="css-0"><code class="css-1lvdtfu">key</code><span><span class="">: The </span></span><a class="chakra-button css-yczznh" href="https://www.apollographql.com/docs/studio/api-keys/#graph-api-keys" target="_blank">graph API key<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> that </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> should use to authenticate with Apollo Studio. You can set this with the </span></span><code class="css-1lvdtfu">APOLLO_KEY</code><span><span class=""> environment variable.</span></span></li><li class="css-0"><code class="css-1lvdtfu">graphRef</code><span><span class="">: A reference of your </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph</span><span/><span class=""> in Apollo's registry, such as </span></span><code class="css-1lvdtfu">graph-id@my-variant</code><span><span class=""> or just </span></span><code class="css-1lvdtfu">graph-id</code><span><span class="">. You can set this with the </span></span><code class="css-1lvdtfu">APOLLO_GRAPH_REF</code><span><span class=""> environment variable.</span></span></li><li class="css-0"><code class="css-1lvdtfu">graphId</code><span><span class="">: The ID of your </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph</span><span/><span class=""> in Apollo's registry. You can set this with the </span></span><code class="css-1lvdtfu">APOLLO_GRAPH_ID</code><span><span class=""> environment variable. You may not specify this if you specify the </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph ref</span><span/><span class="">.</span></span></li><li class="css-0"><code class="css-1lvdtfu">graphVariant</code><span><span class="">: The </span></span><a class="chakra-button css-yczznh" href="https://www.apollographql.com/docs/studio/schema/registry/#managing-environments-with-variants" target="_blank">variant<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> of your </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph</span><span/><span class=""> to associate this server's schema and metrics with. You can set this with the </span></span><code class="css-1lvdtfu">APOLLO_GRAPH_VARIANT</code><span><span class=""> environment variable. The default value is </span></span><code class="css-1lvdtfu">current</code><span><span class="">. You may not specify this if you specify the </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph ref</span><span/><span class="">.</span></span></li></ul></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="allowbatchedhttprequests"><span><a class="chakra-link css-d0tiql" href="#allowbatchedhttprequests"><code class="css-1lvdtfu">allowBatchedHttpRequests</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">Controls whether to allow </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/workflow/requests/#batching">Batching Queries</a><span><span class=""> in a single HTTP Request. Defaults to </span></span><code class="css-1lvdtfu">false</code><span><span class="">. If a request comes in formatted as an array rather than as a single request object, an error will be thrown ( i.e., </span></span><code class="css-1lvdtfu">Operation batching disabled</code><span><span class="">) </span></span><em>unless</em><span><span class=""> batching is enabled.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" colspan="2" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Lifecycle options</strong></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="cache"><span><a class="chakra-link css-d0tiql" href="#cache"><code class="css-1lvdtfu">cache</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">KeyValueCache</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">A </span></span><a class="chakra-button css-yczznh" href="https://www.npmjs.com/package/@apollo/utils.keyvaluecache" target="_blank"><code class="css-1lvdtfu">KeyValueCache</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> which </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> uses for several features, including </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">APQs</span><span/><span class=""> and full response caching. This cache is also available to Apollo Server's plugins.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">The default cache is an </span></span><a class="chakra-button css-yczznh" href="https://www.npmjs.com/package/@apollo/utils.keyvaluecache" target="_blank"><code class="css-1lvdtfu">InMemoryLRUCache</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class=""> with a default size of roughly 30MiB. (For backwards-compatibility with </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> 3, specifying </span></span><code class="css-1lvdtfu">cache: 'bounded'</code><span><span class=""> also selects this default bounded cache.)</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">To learn more about configuring </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class="">'s cache, see </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/performance/cache-backends">Configuring cache backends</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="plugins"><span><a class="chakra-link css-d0tiql" href="#plugins"><code class="css-1lvdtfu">plugins</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Array</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An array of </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/integrations/plugins">plugins</a><span><span class=""> to install in your server instance.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">You can </span></span><em>also</em><span><span class=""> add plugins to your server before you start it using the </span></span><a class="chakra-link css-d0tiql" href="#addplugin"><code class="css-1lvdtfu">addPlugin</code></a><span><span class=""> method. This might be useful in the event that your plugin needs to access the </span></span><code class="css-1lvdtfu">ApolloServer</code><span><span class=""> instance.</span></span></p><p class="chakra-text css-5le3e4"><span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> comes with several plugins that it installs automatically in their default configuration if certain conditions are met. For example, the usage reporting plugin is installed if you provide a </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph</span><span/><span class=""> API key and a </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graph ref</span><span/><span class="">. Apollo Server skips this automatic installation if you manually provide the plugin (in the </span></span><code class="css-1lvdtfu">plugins</code><span><span class=""> array or with the </span></span><code class="css-1lvdtfu">addPlugin</code><span><span class=""> method), or if you provide the plugin's corresponding "disabled" plugin (such as </span></span><code class="css-1lvdtfu">ApolloServerPluginUsageReportingDisabled()</code><span><span class=""> for </span></span><code class="css-1lvdtfu">ApolloServerPluginUsageReporting</code><span><span class="">). For details, see the API references for these plugins: </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/api/plugin/usage-reporting">usage reporting</a><span><span class="">, </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/api/plugin/schema-reporting">schema reporting</a><span><span class="">, </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/api/plugin/landing-pages">landing page</a><span><span class="">, </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/api/plugin/cache-control">cache control</a><span><span class="">, and </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/api/plugin/inline-trace">inline trace</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="stoponterminationsignals"><span><a class="chakra-link css-d0tiql" href="#stoponterminationsignals"><code class="css-1lvdtfu">stopOnTerminationSignals</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">By default, whenever </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> receives a </span></span><code class="css-1lvdtfu">SIGINT</code><span><span class=""> or </span></span><code class="css-1lvdtfu">SIGTERM</code><span><span class=""> signal, it calls </span></span><code class="css-1lvdtfu">await this.stop()</code><span><span class=""> on itself. It then sends that same signal to itself to continue process shutdown. Subsequent </span></span><code class="css-1lvdtfu">SIGINT</code><span><span class=""> and </span></span><code class="css-1lvdtfu">SIGTERM</code><span><span class=""> signals are ignored while </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> awaits </span></span><code class="css-1lvdtfu">this.stop()</code><span><span class="">. Note that this does </span></span><em>not</em><span><span class=""> happen when </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> equals </span></span><code class="css-1lvdtfu">test</code><span><span class=""> or when </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> is running in </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">serverless</span><span/><span class=""> mode.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">Set this option to </span></span><code class="css-1lvdtfu">false</code><span><span class=""> to disable this default behavior, or to </span></span><code class="css-1lvdtfu">true</code><span><span class=""> to enable the behavior even when </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> </span></span><em>does</em><span><span class=""> equal </span></span><code class="css-1lvdtfu">test</code><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">The signal handler is installed after </span></span><a class="chakra-link css-d0tiql" href="#start"><code class="css-1lvdtfu">start()</code></a><span><span class=""> returns successfully.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">You can also manually call </span></span><code class="css-1lvdtfu">stop()</code><span><span class=""> in other contexts. Note that </span></span><code class="css-1lvdtfu">stop()</code><span><span class=""> is asynchronous, so it isn't useful in a </span></span><code class="css-1lvdtfu">process.on('exit')</code><span><span class=""> handler.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" colspan="2" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Debugging options</strong></p></td></tr><tr role="row" class="css-0"><td role="gridcell" style="max-width:200px" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="includestacktraceinerrorresponses"><span><a class="chakra-link css-d0tiql" href="#includestacktraceinerrorresponses"><code class="css-1lvdtfu">includeStacktraceInErrorResponses</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">If </span></span><code class="css-1lvdtfu">true</code><span><span class="">, stack traces are included in </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> responses when errors occur.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">Defaults to </span></span><code class="css-1lvdtfu">true</code><span><span class=""> unless the </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> environment variable is </span></span><code class="css-1lvdtfu">production</code><span><span class=""> or </span></span><code class="css-1lvdtfu">test</code><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="logger"><span><a class="chakra-link css-d0tiql" href="#logger"><code class="css-1lvdtfu">logger</code></a></span></h6><p class="chakra-text css-5le3e4"><a class="chakra-button css-yczznh" href="https://www.npmjs.com/package/@apollo/utils.logger" target="_blank"><code class="css-1lvdtfu">Logger</code><span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An object to use for logging in place of </span></span><code class="css-1lvdtfu">console</code><span><span class="">. If provided, this object must implement all methods of </span></span><a class="chakra-button css-yczznh" href="https://www.npmjs.com/package/@apollo/utils.logger" target="_blank">the <code class="css-1lvdtfu">Logger</code> interface<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class="">.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">If you provide this value, </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> automatically logs all messages of </span></span><em>all</em><span><span class=""> severity levels (</span></span><code class="css-1lvdtfu">debug</code><span><span class=""> through </span></span><code class="css-1lvdtfu">error</code><span><span class="">). It is the responsibility of the logger to determine how to handle logged messages of each level.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">This logger is automatically added to the </span></span><code class="css-1lvdtfu">GraphQLRequestContext</code><span><span class=""> object that's passed to all </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/integrations/plugins">plugin functions</a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="parseoptions"><span><a class="chakra-link css-d0tiql" href="#parseoptions"><code class="css-1lvdtfu">parseOptions</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Object</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">An object that specifies how your server parses </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">GraphQL</span><span/><span class=""> </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class="">. </span></span><a class="chakra-button css-yczznh" href="https://github.com/graphql/graphql-js/blob/9df90799299f40b596938aba15e88c4cd4f2d376/src/language/parser.ts#L77" target="_blank">See <code class="css-1lvdtfu">graphql-js</code> for the available configuration options<span class="chakra-button__icon css-1d409bm"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 12 12" class="css-1v7h6gm"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.71 7.183L11.274.727m0 0v3.69m0-3.69h-3.75M6.06 3.07H1.137a.41.41 0 00-.41.41v7.383a.41.41 0 00.41.41H8.52a.41.41 0 00.41-.41V5.941"/></svg></span></a><span><span class="">.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="nodeenv"><span><a class="chakra-link css-d0tiql" href="#nodeenv"><code class="css-1lvdtfu">nodeEnv</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">string</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><span><span class="">If this is set to any string value, use that value instead of the environment variable </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> for the features whose defaults depend on </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> (such as </span></span><a class="chakra-link css-d0tiql" href="#introspection"><code class="css-1lvdtfu">introspection</code></a><span><span class="">). Note that passing the empty string here is equivalent to running with the </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> environment variable unset. This is primarily meant for testing the effects of the </span></span><code class="css-1lvdtfu">NODE_ENV</code><span><span class=""> environment variable.</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><h6 class="chakra-heading css-1pm5o6a" id="status400forvariablecoercionerrors"><span><a class="chakra-link css-d0tiql" href="#status400forvariablecoercionerrors"><code class="css-1lvdtfu">status400ForVariableCoercionErrors</code></a></span></h6><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">boolean</code></p></td><td role="gridcell" class="css-hiju5f"><p class="chakra-text css-5le3e4"><strong>Set this option to <code class="css-1lvdtfu">true</code>.</strong><span><span class=""> It mitigates a regression introduced in </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> v4 where the server returns a 200 status code (instead of 400) when a client </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">query</span><span/><span class=""> provides invalid </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">variables</span><span/><span class="">. </span></span><a class="chakra-link css-d0tiql" href="/docs/apollo-server/migration/#known-regressions">Learn more.</a></p><p class="chakra-text css-5le3e4"><span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">Apollo Server</span><span/><span class=""> v5 will </span></span><em>always</em><span><span class=""> behave as if this option is </span></span><code class="css-1lvdtfu">true</code><span><span class=""> (and will ignore any provided value).</span></span></p></td></tr><tr role="row" class="css-0"><td role="gridcell" class="css-hiju5f"><style data-emotion="css 1mvj8kx">.css-1mvj8kx{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-medium);font-size:var(--chakra-fontSizes-md);line-height:1.2;}</style><h5 class="chakra-heading css-1mvj8kx" id="dangerouslydisablevalidation"><span><a class="chakra-link css-d0tiql" href="#dangerouslydisablevalidation"><code class="css-1lvdtfu">dangerouslyDisableValidation</code></a></span></h5><p class="chakra-text css-5le3e4"><code class="css-1lvdtfu">Boolean</code></p></td><td role="gridcell" class="css-hiju5f">⚠️ Caution: this option can lead to security vulnerabilities and unexpected behavior. Use of this option in production is not supported by Apollo.<p class="chakra-text css-5le3e4"><span><span class="">When set to </span></span><code class="css-1lvdtfu">true</code><span><span class="">, disable validation of </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">graphql</span><span/><span class=""> </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operations</span><span/><span class=""> entirely.</span></span></p><p class="chakra-text css-5le3e4"><span><span class="">You might find this option interesting for performance reasons if you handle </span><span id="popover-trigger-1" aria-haspopup="dialog" aria-expanded="false" aria-controls="popover-content-1" class="css-154yii">operation</span><span/><span class=""> validation at build time and enforce that only known, validated
推荐文章
乐观的小刀
·
第89届奥斯卡奖提名揭晓 《爱乐之城》14项提名_新闻中心_中国网
1 月前
风流的匕首
·
牢牢把握新时代做好经济工作的规律性认识(推动高质量发展 实现经济行稳致远)
2 月前
旅行中的红茶
·
探索赋能产业链发展新路径
2 月前
坚强的领带
·
“二次元”文化,从小众走向大众-新华网
4 月前
骑白马的金针菇
·
tabular + table results in "Not in outer par mode" - TeX - LaTeX Stack Exchange
11 月前