diff --git a/404.html b/404.html index a145286a1..5cf536ecc 100644 --- a/404.html +++ b/404.html @@ -8,9 +8,9 @@ - - - + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/css/styles.47560928.css b/assets/css/styles.47560928.css new file mode 100644 index 000000000..a8b93f86f --- /dev/null +++ b/assets/css/styles.47560928.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.DocSearch-Button,.button{-webkit-user-select:none;-moz-user-select:none}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,.2),0 2px 4px 0 rgba(0,0,0,.1);--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:rgba(0,0,0,.03);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-code-font-size:95%;--ifm-color-primary:#5f3e6b;--ifm-color-primary-dark:#563860;--ifm-color-primary-darker:#51355b;--ifm-color-primary-darkest:#432b4b;--ifm-color-primary-light:#684476;--ifm-color-primary-lighter:#6d477b;--ifm-color-primary-lightest:#7b518b;--darklang-white:#f8f8f8;--darklang-black:#2f2f2f;--darklang-darkBackground-grey:#6f6f6f;--darklang-lightBackground-grey:#8f8f8f;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12);--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:transparent;--docusaurus-collapse-button-bg-hover:rgba(0,0,0,.1);--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%;height:auto}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration);color:#6d74c5}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:rgba(53,120,229,.15);--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:rgba(235,237,240,.15);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:rgba(0,164,0,.15);--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:rgba(84,199,236,.15);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:rgba(255,186,0,.15);--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:rgba(250,56,62,.15);--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{-moz-column-gap:var(--ifm-avatar-intro-margin);column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs__link:-moz-any-link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs__link:any-link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.logos p{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:hsla(0,0%,100%,.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,.5);color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:hsla(0,0%,100%,.05);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::-moz-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{-moz-column-gap:var(--ifm-pagination-page-spacing);column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.logos .darkBackground,.logos .darkBackground .spacer{color:var(--darklang-darkBackground-grey)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,.05);--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:hsla(0,0%,100%,.1);--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:hsla(0,0%,100%,.07);--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.302);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.logos{display:flex;flex-direction:row;flex-wrap:wrap;margin:2em 0;width:100%}.logos .colors,.logos .logo,.logos .wordmark{height:13rem;padding:1.5em;width:50%}.logos a{font-size:.8rem;font-weight:700}.logos .logo,.logos .wordmark{align-items:center;display:flex;flex-direction:column;justify-content:center;position:relative}.logos .logo img,.logos .wordmark img{height:8rem;width:auto}.logos .spacer{padding-left:.4rem;padding-right:.4rem}.logos .darkBackground{background:var(--darklang-black)}.logos .darkBackground a{color:#6d74c5}.logos .darkBackground a:hover{color:var(--darklang-white)}.logos .lightBackground{background:var(--darklang-white)}.logos .lightBackground .spacer{color:#8f8f8f}.logos .transparent{border-radius:60px;height:1.3rem;line-height:1.3rem;padding:0 .4rem .1rem;position:absolute;right:.7rem;top:.7rem}.logos .darkBackground .transparent{background:#f8f8f833;color:#c8c8c8}.logos .lightBackground .transparent{background:#28282833;color:#282828}.logos .colors{display:flex;flex-direction:row;flex-wrap:wrap;padding-top:2.5rem}.logos .colors .colorName{height:1rem;line-height:1rem;padding-right:1.5rem;text-align:right;width:50%}.logos .colors .swatch{border-radius:60px;font-size:.8rem;height:1.2rem;line-height:1rem;padding:1px 6px 2px}.logos .lightBackground.colors .black{background:var(--darklang-black);color:var(--darklang-white)}.logos .lightBackground.colors .white{background:var(--darklang-white);border:1px solid;border-color:var(--darklang-black);color:var(--darklang-black);padding-top:0}.logos .lightBackground.colors .purple{background:#955b9f;color:var(--darklang-white)}.logos .darkBackground.colors .blue,.logos .lightBackground.colors .blue{background:#747ab9;color:var(--darklang-white)}.logos .darkBackground.colors .black{background:var(--darklang-black);border:1px solid;border-color:var(--darklang-white);color:var(--darklang-white);padding-top:0}.logos .darkBackground.colors .white{background:var(--darklang-white);color:var(--darklang-black)}.logos .darkBackground.colors .purple{background:#8f5ea1;border-width:0;color:var(--darklang-white)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;user-select:none}.DocSearch-Footer,.DocSearch-Help{-webkit-user-select:none;-moz-user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:0 0;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;-moz-appearance:none;border:0;cursor:pointer}.DocSearch-Input::-moz-placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:0 0}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:hsla(0,0%,100%,.05);--docusaurus-collapse-button-bg-hover:hsla(0,0%,100%,.1)}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;-moz-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 rgba(0,0,0,.15);transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 rgba(0,0,0,.2)}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{-moz-column-gap:.2rem;column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::-moz-placeholder{color:var(--docsearch-muted-color)}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:rgba(255,215,142,.25);color:var(--docsearch-hit-color);padding:.09em 0}@media only screen and (min-device-width:360px) and (max-device-width:736px);@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media only screen and (min-width:1024px);@media only screen and (min-width:1400px);@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media only screen and (min-width:1500px);@media only screen and (max-width:1023px);@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.6025cdcf.css b/assets/css/styles.6025cdcf.css deleted file mode 100644 index 5c3bddcd4..000000000 --- a/assets/css/styles.6025cdcf.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,.hash-link{-webkit-user-select:none;-moz-user-select:none}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,.2),0 2px 4px 0 rgba(0,0,0,.1);--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:rgba(0,0,0,.03);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-code-font-size:95%;--ifm-color-primary:#5f3e6b;--ifm-color-primary-dark:#563860;--ifm-color-primary-darker:#51355b;--ifm-color-primary-darkest:#432b4b;--ifm-color-primary-light:#684476;--ifm-color-primary-lighter:#6d477b;--ifm-color-primary-lightest:#7b518b;--darklang-white:#f8f8f8;--darklang-black:#2f2f2f;--darklang-darkBackground-grey:#6f6f6f;--darklang-lightBackground-grey:#8f8f8f;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:transparent;--docusaurus-collapse-button-bg-hover:rgba(0,0,0,.1);--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12);--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%;height:auto}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration);color:#6d74c5}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:rgba(53,120,229,.15);--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:rgba(235,237,240,.15);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:rgba(0,164,0,.15);--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:rgba(84,199,236,.15);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:rgba(255,186,0,.15);--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:rgba(250,56,62,.15);--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{-moz-column-gap:var(--ifm-avatar-intro-margin);column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs__link:-moz-any-link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs__link:any-link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.logos p{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:hsla(0,0%,100%,.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,.5);color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:hsla(0,0%,100%,.05);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::-moz-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{-moz-column-gap:var(--ifm-pagination-page-spacing);column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.logos .darkBackground,.logos .darkBackground .spacer{color:var(--darklang-darkBackground-grey)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,.05);--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:hsla(0,0%,100%,.1);--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:hsla(0,0%,100%,.07);--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.302);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.logos{display:flex;flex-direction:row;flex-wrap:wrap;margin:2em 0;width:100%}.logos .colors,.logos .logo,.logos .wordmark{height:13rem;padding:1.5em;width:50%}.logos a{font-size:.8rem;font-weight:700}.logos .logo,.logos .wordmark{align-items:center;display:flex;flex-direction:column;justify-content:center;position:relative}.logos .logo img,.logos .wordmark img{height:8rem;width:auto}.logos .spacer{padding-left:.4rem;padding-right:.4rem}.logos .darkBackground{background:var(--darklang-black)}.logos .darkBackground a{color:#6d74c5}.logos .darkBackground a:hover{color:var(--darklang-white)}.logos .lightBackground{background:var(--darklang-white)}.logos .lightBackground .spacer{color:#8f8f8f}.logos .transparent{border-radius:60px;height:1.3rem;line-height:1.3rem;padding:0 .4rem .1rem;position:absolute;right:.7rem;top:.7rem}.logos .darkBackground .transparent{background:#f8f8f833;color:#c8c8c8}.logos .lightBackground .transparent{background:#28282833;color:#282828}.logos .colors{display:flex;flex-direction:row;flex-wrap:wrap;padding-top:2.5rem}.logos .colors .colorName{height:1rem;line-height:1rem;padding-right:1.5rem;text-align:right;width:50%}.logos .colors .swatch{border-radius:60px;font-size:.8rem;height:1.2rem;line-height:1rem;padding:1px 6px 2px}.logos .lightBackground.colors .black{background:var(--darklang-black);color:var(--darklang-white)}.logos .lightBackground.colors .white{background:var(--darklang-white);border:1px solid;border-color:var(--darklang-black);color:var(--darklang-black);padding-top:0}.logos .lightBackground.colors .purple{background:#955b9f;color:var(--darklang-white)}.logos .darkBackground.colors .blue,.logos .lightBackground.colors .blue{background:#747ab9;color:var(--darklang-white)}.logos .darkBackground.colors .black{background:var(--darklang-black);border:1px solid;border-color:var(--darklang-white);color:var(--darklang-white);padding-top:0}.logos .darkBackground.colors .white{background:var(--darklang-white);color:var(--darklang-black)}.logos .darkBackground.colors .purple{background:#8f5ea1;border-width:0;color:var(--darklang-white)}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.navbarSearchContainer_Bca1:empty,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.DocSearch-Container a,.tag_zVej:hover{text-decoration:none}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);user-select:none}.DocSearch-Button,.DocSearch-Help{-webkit-user-select:none;-moz-user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 rgba(0,0,0,.15);transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 rgba(0,0,0,.2)}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{-moz-column-gap:.2rem;column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::-moz-placeholder{color:var(--docsearch-muted-color)}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite a;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes a{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:rgba(255,215,142,.25);color:var(--docsearch-hit-color);padding:.09em 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:hsla(0,0%,100%,.05);--docusaurus-collapse-button-bg-hover:hsla(0,0%,100%,.1)}.collapseSidebarButton_PEFL{display:none;margin:0}.docSidebarContainer_YfHR,.sidebarLogo_isFc{display:none}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:0 0;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;-moz-appearance:none;border:0;cursor:pointer}.DocSearch-Input::-moz-placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards b;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:0 0}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes b{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}@media only screen and (min-device-width:360px) and (max-device-width:736px);@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media only screen and (min-width:1024px);@media only screen and (min-width:1400px);@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media only screen and (min-width:1500px);@media only screen and (max-width:1023px);@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/06d8c526.43407486.js b/assets/js/06d8c526.bf74672f.js similarity index 96% rename from assets/js/06d8c526.43407486.js rename to assets/js/06d8c526.bf74672f.js index 07dea7093..f82904e60 100644 --- a/assets/js/06d8c526.43407486.js +++ b/assets/js/06d8c526.bf74672f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3681],{12490:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>d,contentTitle:()=>i,default:()=>o,frontMatter:()=>a,metadata:()=>t,toc:()=>h});var l=r(85893),s=r(11151);const a={},i="Darklang Release 3",t={id:"changelog/release-3",title:"Darklang Release 3",description:"July 1, 2022",source:"@site/docs-classic/changelog/release-3.md",sourceDirName:"changelog",slug:"/changelog/release-3",permalink:"/changelog/release-3",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-3.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 4 - July, 2022",permalink:"/changelog/release-4"},next:{title:"Release 2 - June 6, 2022",permalink:"/changelog/release-2"}},d={},h=[{value:"Language improvements",id:"language-improvements",level:2},{value:"Stdlib improvements",id:"stdlib-improvements",level:2},{value:"Editor improvements",id:"editor-improvements",level:2},{value:"HTTP Framework improvements",id:"http-framework-improvements",level:2},{value:"Internal improvements",id:"internal-improvements",level:2}];function c(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e.header,{children:(0,l.jsx)(e.h1,{id:"darklang-release-3",children:"Darklang Release 3"})}),"\n",(0,l.jsx)(e.p,{children:"July 1, 2022"}),"\n",(0,l.jsx)(e.p,{children:"Darklang Release 3 is focused primarily on taking advantage of the recent\nchanges, including new StdLib functions, small languages changes, and sunsetting\nold features."}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["See the ",(0,l.jsx)(e.a,{href:"https://blog.darklang.com/darklang-release-3/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,l.jsx)(e.h2,{id:"language-improvements",children:"Language improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["When a function is called with a runtime error as an argument, return the\nruntime error instead of a new error\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4095",children:"#4095"}),"). This was a significant\nsource of annoyance for devs trying to figure out why their code wasn't\nworking."]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["64-bit ints now work end-to-end (previously we had two separate issues with\nnumbers above ",(0,l.jsx)(e.code,{children:"2^53"})," and numbers above ",(0,l.jsx)(e.code,{children:"2^63"}),")\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4209",children:"#4209"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"stdlib-improvements",children:"Stdlib improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow ",(0,l.jsx)(e.code,{children:"HttpClient::basicAuth_v0"})," and ",(0,l.jsx)(e.code,{children:"HttpClient::basicAuth_v1"})," to run in the\neditor (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4147",children:"#4147"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow ",(0,l.jsx)(e.code,{children:"Crypto::sha256_v0"}),", ",(0,l.jsx)(e.code,{children:"Crypto::sha384_v0"})," to run in the editor\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4146",children:"#4146"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["rename ",(0,l.jsx)(e.code,{children:"String::toInt"})," to ",(0,l.jsx)(e.code,{children:"Int::parse_v0"}),", making it work for 64 bit ints\n(previous version only supported 63-bit ints)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4191",children:"#4191"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["add ",(0,l.jsx)(e.code,{children:"List::all"})," (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4150",children:"#4150"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Mark ",(0,l.jsx)(e.code,{children:"Date::today"})," as impure\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4149",children:"#4149"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add new versions of Date functions ",(0,l.jsx)(e.code,{children:"Date::hour_v1"}),", ",(0,l.jsx)(e.code,{children:"Date::minute_v1"}),", and\n",(0,l.jsx)(e.code,{children:"Date::second_v1"}),", which unlike the previous versions do not return negative\nresults for dates before 1970!\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4133",children:"#4133"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Rename the ",(0,l.jsx)(e.code,{children:"f"})," parameter of functions using first-class functions to ",(0,l.jsx)(e.code,{children:"fn"}),"\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4156",children:"#4156"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4150",children:"#4150"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Use camelCase in all standard library parameters\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4201",children:"#4201"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix typos and poor wording in a lot of error messages and functions\ndescriptions (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4096",children:"#4096"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4200",children:"#4200"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"editor-improvements",children:"Editor improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix using secrets when run in the editor\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4128",children:"#4128"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/issues/4129",children:"#4129"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix occasional crash in editor analysis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4117",children:"#4117"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4089",children:"#4098"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4070",children:"#4070"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove the old (OCaml-based) analysis, reducing the size of the editor\ndownload and speeding up startup\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4158",children:"#4148"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove the canvas minimap which was causing a long hang when switching to edit\nfunctions (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4106",children:"#4106"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"http-framework-improvements",children:"HTTP Framework improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Load programs faster by removing 3-4 fewer DB requests during load\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4051",children:"#4051"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"internal-improvements",children:"Internal improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Make the Dark repo build on Mac with M1/M2 (arm) chips\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4237",children:"#4237"}),")."]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove a lot of old OCaml code\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4140",children:"#4140"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4138",children:"#4138"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4195",children:"#4195"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4158",children:"#4158"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4074",children:"#4074"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4225",children:"#4225"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove all Rust from the codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4057",children:"#4057"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove all Go from the codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4039",children:"#4039"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor the client (Rescript) codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4199",children:"#4199"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4203",children:"#4203"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4206",children:"#4206"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4218",children:"#4218"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4220",children:"#4220"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Many steps to speed up the CI/CD pipeline\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4090",children:"#4090"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4088",children:"#4088"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4087",children:"#4087"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4083",children:"#4083"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4068",children:"#4068"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow multiple deploys more safely in our CI/CD pipeline\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4082",children:"#4082"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4076",children:"#4076"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4073",children:"#4073"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4072",children:"#4072"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4067",children:"#4067"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor integration tests away from being one big file\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4167",children:"#4167"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fail deploy if assets don't upload\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4186",children:"#4186"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix flaky tests (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4205",children:"#4205"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4207",children:"#4207"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4222",children:"#4222"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove unused DarkInternal functions\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4056",children:"#4056"}),")"]}),"\n"]}),"\n"]})]})}function o(n={}){const{wrapper:e}={...(0,s.a)(),...n.components};return e?(0,l.jsx)(e,{...n,children:(0,l.jsx)(c,{...n})}):c(n)}},11151:(n,e,r)=>{r.d(e,{Z:()=>t,a:()=>i});var l=r(67294);const s={},a=l.createContext(s);function i(n){const e=l.useContext(a);return l.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:i(n.components),l.createElement(a.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9005],{42012:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>d,contentTitle:()=>i,default:()=>o,frontMatter:()=>a,metadata:()=>t,toc:()=>h});var l=r(74848),s=r(28453);const a={},i="Darklang Release 3",t={id:"changelog/release-3",title:"Darklang Release 3",description:"July 1, 2022",source:"@site/docs-classic/changelog/release-3.md",sourceDirName:"changelog",slug:"/changelog/release-3",permalink:"/changelog/release-3",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-3.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 4 - July, 2022",permalink:"/changelog/release-4"},next:{title:"Release 2 - June 6, 2022",permalink:"/changelog/release-2"}},d={},h=[{value:"Language improvements",id:"language-improvements",level:2},{value:"Stdlib improvements",id:"stdlib-improvements",level:2},{value:"Editor improvements",id:"editor-improvements",level:2},{value:"HTTP Framework improvements",id:"http-framework-improvements",level:2},{value:"Internal improvements",id:"internal-improvements",level:2}];function c(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e.header,{children:(0,l.jsx)(e.h1,{id:"darklang-release-3",children:"Darklang Release 3"})}),"\n",(0,l.jsx)(e.p,{children:"July 1, 2022"}),"\n",(0,l.jsx)(e.p,{children:"Darklang Release 3 is focused primarily on taking advantage of the recent\nchanges, including new StdLib functions, small languages changes, and sunsetting\nold features."}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["See the ",(0,l.jsx)(e.a,{href:"https://blog.darklang.com/darklang-release-3/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,l.jsx)(e.h2,{id:"language-improvements",children:"Language improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["When a function is called with a runtime error as an argument, return the\nruntime error instead of a new error\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4095",children:"#4095"}),"). This was a significant\nsource of annoyance for devs trying to figure out why their code wasn't\nworking."]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["64-bit ints now work end-to-end (previously we had two separate issues with\nnumbers above ",(0,l.jsx)(e.code,{children:"2^53"})," and numbers above ",(0,l.jsx)(e.code,{children:"2^63"}),")\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4209",children:"#4209"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"stdlib-improvements",children:"Stdlib improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow ",(0,l.jsx)(e.code,{children:"HttpClient::basicAuth_v0"})," and ",(0,l.jsx)(e.code,{children:"HttpClient::basicAuth_v1"})," to run in the\neditor (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4147",children:"#4147"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow ",(0,l.jsx)(e.code,{children:"Crypto::sha256_v0"}),", ",(0,l.jsx)(e.code,{children:"Crypto::sha384_v0"})," to run in the editor\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4146",children:"#4146"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["rename ",(0,l.jsx)(e.code,{children:"String::toInt"})," to ",(0,l.jsx)(e.code,{children:"Int::parse_v0"}),", making it work for 64 bit ints\n(previous version only supported 63-bit ints)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4191",children:"#4191"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["add ",(0,l.jsx)(e.code,{children:"List::all"})," (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4150",children:"#4150"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Mark ",(0,l.jsx)(e.code,{children:"Date::today"})," as impure\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4149",children:"#4149"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add new versions of Date functions ",(0,l.jsx)(e.code,{children:"Date::hour_v1"}),", ",(0,l.jsx)(e.code,{children:"Date::minute_v1"}),", and\n",(0,l.jsx)(e.code,{children:"Date::second_v1"}),", which unlike the previous versions do not return negative\nresults for dates before 1970!\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4133",children:"#4133"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Rename the ",(0,l.jsx)(e.code,{children:"f"})," parameter of functions using first-class functions to ",(0,l.jsx)(e.code,{children:"fn"}),"\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4156",children:"#4156"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4150",children:"#4150"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Use camelCase in all standard library parameters\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4201",children:"#4201"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix typos and poor wording in a lot of error messages and functions\ndescriptions (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4096",children:"#4096"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4200",children:"#4200"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"editor-improvements",children:"Editor improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix using secrets when run in the editor\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4128",children:"#4128"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/issues/4129",children:"#4129"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix occasional crash in editor analysis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4117",children:"#4117"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4089",children:"#4098"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4070",children:"#4070"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove the old (OCaml-based) analysis, reducing the size of the editor\ndownload and speeding up startup\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4158",children:"#4148"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove the canvas minimap which was causing a long hang when switching to edit\nfunctions (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4106",children:"#4106"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"http-framework-improvements",children:"HTTP Framework improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Load programs faster by removing 3-4 fewer DB requests during load\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4051",children:"#4051"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"internal-improvements",children:"Internal improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Make the Dark repo build on Mac with M1/M2 (arm) chips\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4237",children:"#4237"}),")."]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove a lot of old OCaml code\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4140",children:"#4140"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4138",children:"#4138"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4195",children:"#4195"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4158",children:"#4158"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4074",children:"#4074"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4225",children:"#4225"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove all Rust from the codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4057",children:"#4057"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove all Go from the codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4039",children:"#4039"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor the client (Rescript) codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4199",children:"#4199"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4203",children:"#4203"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4206",children:"#4206"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4218",children:"#4218"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4220",children:"#4220"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Many steps to speed up the CI/CD pipeline\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4090",children:"#4090"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4088",children:"#4088"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4087",children:"#4087"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4083",children:"#4083"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4068",children:"#4068"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow multiple deploys more safely in our CI/CD pipeline\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4082",children:"#4082"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4076",children:"#4076"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4073",children:"#4073"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4072",children:"#4072"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4067",children:"#4067"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor integration tests away from being one big file\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4167",children:"#4167"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fail deploy if assets don't upload\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4186",children:"#4186"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix flaky tests (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4205",children:"#4205"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4207",children:"#4207"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4222",children:"#4222"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Remove unused DarkInternal functions\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4056",children:"#4056"}),")"]}),"\n"]}),"\n"]})]})}function o(n={}){const{wrapper:e}={...(0,s.R)(),...n.components};return e?(0,l.jsx)(e,{...n,children:(0,l.jsx)(c,{...n})}):c(n)}},28453:(n,e,r)=>{r.d(e,{R:()=>i,x:()=>t});var l=r(96540);const s={},a=l.createContext(s);function i(n){const e=l.useContext(a);return l.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:i(n.components),l.createElement(a.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/0742f8ef.b5af475d.js b/assets/js/0742f8ef.af5b8762.js similarity index 53% rename from assets/js/0742f8ef.b5af475d.js rename to assets/js/0742f8ef.af5b8762.js index 7ed98ebfd..b9a3f9141 100644 --- a/assets/js/0742f8ef.b5af475d.js +++ b/assets/js/0742f8ef.af5b8762.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2320],{25456:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=n(85893),a=n(11151);const r={title:"Tutorial: Create a tool in a REPL",sidebar_label:"Create a tool in a REPL",id:"create-tool-repl"},i=void 0,o={id:"tutorials/create-tool-repl",title:"Tutorial: Create a tool in a REPL",description:"REPLs in Darklang are general-purpose coding blocks. They're typically to create",source:"@site/docs-classic/tutorials/03-create-tool-repl.md",sourceDirName:"tutorials",slug:"/tutorials/create-tool-repl",permalink:"/tutorials/create-tool-repl",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/tutorials/03-create-tool-repl.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Tutorial: Create a tool in a REPL",sidebar_label:"Create a tool in a REPL",id:"create-tool-repl"},sidebar:"docs",previous:{title:"Create a HTTP handler",permalink:"/tutorials/create-http-handler"},next:{title:"Save data to a Datastore",permalink:"/tutorials/save-data-to-datastore"}},l={},c=[];function d(e){const t={code:"code",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"REPLs in Darklang are general-purpose coding blocks. They're typically to create\nreusable tools, experiments, one-off commands, or admin dashboards, in a similar\nway that you might use scripts or REPLs in other languages."}),"\n",(0,s.jsxs)(t.p,{children:["We'll run you through creating a REPL, experimenting with the ",(0,s.jsx)(t.code,{children:"HttpClient"}),"\nlibrary to make API calls."]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Open the omnibox by pressing (",(0,s.jsx)(t.code,{children:"Ctrl-K"}),"/",(0,s.jsx)(t.code,{children:"Cmd-K"}),"), and create a new REPL."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:'Type "httpclient" in the REPL (lowercase, no spaces)'}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.20.25_AM.png",src:n(46231).Z+"",width:"1340",height:"456"})}),"\n",(0,s.jsxs)(t.p,{children:["This will show you all the standard library functions for ",(0,s.jsx)(t.code,{children:"HttpClient"}),", their\nsignatures, and their docstrings."]}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:'Continue typing, until you have "httpclientpost". Darklang autocompletes on\nsubstrings so getting the exact text isn\'t important:'}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.21.21_AM.png",src:n(37344).Z+"",width:"1318",height:"530"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsx)(t.li,{children:"Hit enter to add the function into the handler."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.22.01_AM.png",src:n(71774).Z+"",width:"1642",height:"282"})}),"\n",(0,s.jsxs)(t.p,{children:["Darklang automatically creates spaces for the four arguments that\n",(0,s.jsx)(t.code,{children:"HttpClient::post"})," requires. We display a gray play button beside the function\n\u2013 it will turn green when all the arguments are complete, allowing you to\nrun the function from within the editor."]}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsxs)(t.li,{children:["Let's call a new ",(0,s.jsx)(t.code,{children:"/test"})," endpoint for the application we're developing. As we\nsaw from the GET, our endpoints live at\nUSERNAME-gettingstarted.builtwithdark.com, so enter a string like\n",(0,s.jsx)(t.code,{children:'"https://USERNAME-gettingstarted.builtwithdark.com/test"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.24.08_AM.png",src:n(18009).Z+"",width:"906",height:"374"})}),"\n",(0,s.jsxs)(t.ol,{start:"6",children:["\n",(0,s.jsx)(t.li,{children:"Next let's add the arguments. The structured editor simplifies creation of\nthe arguments we want:"}),"\n"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["For the body, we want to pass the value ",(0,s.jsx)(t.code,{children:'{ test : "test1" }'}),". To do so, type\n",(0,s.jsx)(t.code,{children:"{"})," to start a record, then hit enter and add the key and the value."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["For the query, we want an empty dictionary. Type ",(0,s.jsx)(t.code,{children:"{"})," to create one."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:'For the header, we want the JSON content-type, so type "json" and the\nautocomplete will offer you a function to use.'}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.41.50_AM.png",src:n(50645).Z+"",width:"1088",height:"572"})}),"\n",(0,s.jsxs)(t.ol,{start:"7",children:["\n",(0,s.jsx)(t.li,{children:"Once we've filled in all the arguments, the play button (\u25b6\ufe0f) next to the\nfunction turns green, which means we can execute this code from within the\neditor."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.42.45_AM.png",src:n(36937).Z+"",width:"872",height:"454"})}),"\n",(0,s.jsxs)(t.ol,{start:"8",children:["\n",(0,s.jsxs)(t.li,{children:["Hitting play we receive a 404 response. This is because there's no ",(0,s.jsx)(t.code,{children:"/test"}),"\nendpoint on our canvas (yet!)"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.43.39_AM.png",src:n(15803).Z+"",width:"780",height:"876"})}),"\n",(0,s.jsxs)(t.ol,{start:"9",children:["\n",(0,s.jsx)(t.li,{children:"404s in Darklang appear in the 404 section of the sidebar. We'll discuss that\nmore later."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.44.10_AM.png",src:n(3142).Z+"",width:"1660",height:"834"})}),"\n",(0,s.jsx)(t.p,{children:"Congratulations! You've built a Darklang REPL and which calls the Darklang HTTP\nClient function."})]})}function h(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},50645:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.41.50_AM-c53535ca6fe664a0cc441634905d13e2.png"},36937:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.42.45_AM-bd40cdd248f6628e8ed3d331cf8085db.png"},15803:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.43.39_AM-96aec4bbac8b226b6faadb9a21dead27.png"},3142:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.44.10_AM-a5fd8015f73a5c0dc67b66bacf0fd063.png"},46231:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.20.25_AM-88792565054973a931d547c7a551ef38.png"},37344:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.21.21_AM-735568ac9b609feda9f0069874de01d0.png"},71774:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.22.01_AM-ea29a4960850bc174d84c6fbebb46d72.png"},18009:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.24.08_AM-6c45a177945d900751efc0d010b0c044.png"},11151:(e,t,n)=>{n.d(t,{Z:()=>o,a:()=>i});var s=n(67294);const a={},r=s.createContext(a);function i(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5381],{74629:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=n(74848),a=n(28453);const r={title:"Tutorial: Create a tool in a REPL",sidebar_label:"Create a tool in a REPL",id:"create-tool-repl"},i=void 0,o={id:"tutorials/create-tool-repl",title:"Tutorial: Create a tool in a REPL",description:"REPLs in Darklang are general-purpose coding blocks. They're typically to create",source:"@site/docs-classic/tutorials/03-create-tool-repl.md",sourceDirName:"tutorials",slug:"/tutorials/create-tool-repl",permalink:"/tutorials/create-tool-repl",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/tutorials/03-create-tool-repl.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Tutorial: Create a tool in a REPL",sidebar_label:"Create a tool in a REPL",id:"create-tool-repl"},sidebar:"docs",previous:{title:"Create a HTTP handler",permalink:"/tutorials/create-http-handler"},next:{title:"Save data to a Datastore",permalink:"/tutorials/save-data-to-datastore"}},l={},c=[];function d(e){const t={code:"code",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"REPLs in Darklang are general-purpose coding blocks. They're typically to create\nreusable tools, experiments, one-off commands, or admin dashboards, in a similar\nway that you might use scripts or REPLs in other languages."}),"\n",(0,s.jsxs)(t.p,{children:["We'll run you through creating a REPL, experimenting with the ",(0,s.jsx)(t.code,{children:"HttpClient"}),"\nlibrary to make API calls."]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Open the omnibox by pressing (",(0,s.jsx)(t.code,{children:"Ctrl-K"}),"/",(0,s.jsx)(t.code,{children:"Cmd-K"}),"), and create a new REPL."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:'Type "httpclient" in the REPL (lowercase, no spaces)'}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.20.25_AM.png",src:n(96449).A+"",width:"1340",height:"456"})}),"\n",(0,s.jsxs)(t.p,{children:["This will show you all the standard library functions for ",(0,s.jsx)(t.code,{children:"HttpClient"}),", their\nsignatures, and their docstrings."]}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:'Continue typing, until you have "httpclientpost". Darklang autocompletes on\nsubstrings so getting the exact text isn\'t important:'}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.21.21_AM.png",src:n(85320).A+"",width:"1318",height:"530"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsx)(t.li,{children:"Hit enter to add the function into the handler."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.22.01_AM.png",src:n(29965).A+"",width:"1642",height:"282"})}),"\n",(0,s.jsxs)(t.p,{children:["Darklang automatically creates spaces for the four arguments that\n",(0,s.jsx)(t.code,{children:"HttpClient::post"})," requires. We display a gray play button beside the function\n\u2013 it will turn green when all the arguments are complete, allowing you to\nrun the function from within the editor."]}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsxs)(t.li,{children:["Let's call a new ",(0,s.jsx)(t.code,{children:"/test"})," endpoint for the application we're developing. As we\nsaw from the GET, our endpoints live at\nUSERNAME-gettingstarted.builtwithdark.com, so enter a string like\n",(0,s.jsx)(t.code,{children:'"https://USERNAME-gettingstarted.builtwithdark.com/test"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_9.24.08_AM.png",src:n(2484).A+"",width:"906",height:"374"})}),"\n",(0,s.jsxs)(t.ol,{start:"6",children:["\n",(0,s.jsx)(t.li,{children:"Next let's add the arguments. The structured editor simplifies creation of\nthe arguments we want:"}),"\n"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["For the body, we want to pass the value ",(0,s.jsx)(t.code,{children:'{ test : "test1" }'}),". To do so, type\n",(0,s.jsx)(t.code,{children:"{"})," to start a record, then hit enter and add the key and the value."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["For the query, we want an empty dictionary. Type ",(0,s.jsx)(t.code,{children:"{"})," to create one."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:'For the header, we want the JSON content-type, so type "json" and the\nautocomplete will offer you a function to use.'}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.41.50_AM.png",src:n(49998).A+"",width:"1088",height:"572"})}),"\n",(0,s.jsxs)(t.ol,{start:"7",children:["\n",(0,s.jsx)(t.li,{children:"Once we've filled in all the arguments, the play button (\u25b6\ufe0f) next to the\nfunction turns green, which means we can execute this code from within the\neditor."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.42.45_AM.png",src:n(21927).A+"",width:"872",height:"454"})}),"\n",(0,s.jsxs)(t.ol,{start:"8",children:["\n",(0,s.jsxs)(t.li,{children:["Hitting play we receive a 404 response. This is because there's no ",(0,s.jsx)(t.code,{children:"/test"}),"\nendpoint on our canvas (yet!)"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.43.39_AM.png",src:n(59905).A+"",width:"780",height:"876"})}),"\n",(0,s.jsxs)(t.ol,{start:"9",children:["\n",(0,s.jsx)(t.li,{children:"404s in Darklang appear in the 404 section of the sidebar. We'll discuss that\nmore later."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"gettingstarted/Screen_Shot_2020-02-11_at_10.44.10_AM.png",src:n(33415).A+"",width:"1660",height:"834"})}),"\n",(0,s.jsx)(t.p,{children:"Congratulations! You've built a Darklang REPL and which calls the Darklang HTTP\nClient function."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},49998:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.41.50_AM-c53535ca6fe664a0cc441634905d13e2.png"},21927:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.42.45_AM-bd40cdd248f6628e8ed3d331cf8085db.png"},59905:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.43.39_AM-96aec4bbac8b226b6faadb9a21dead27.png"},33415:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_10.44.10_AM-a5fd8015f73a5c0dc67b66bacf0fd063.png"},96449:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.20.25_AM-88792565054973a931d547c7a551ef38.png"},85320:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.21.21_AM-735568ac9b609feda9f0069874de01d0.png"},29965:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.22.01_AM-ea29a4960850bc174d84c6fbebb46d72.png"},2484:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/Screen_Shot_2020-02-11_at_9.24.08_AM-6c45a177945d900751efc0d010b0c044.png"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var s=n(96540);const a={},r=s.createContext(a);function i(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/08616192.5567ff8b.js b/assets/js/08616192.ed0aee9b.js similarity index 96% rename from assets/js/08616192.5567ff8b.js rename to assets/js/08616192.ed0aee9b.js index ef8e7b1b8..5ec9c3989 100644 --- a/assets/js/08616192.5567ff8b.js +++ b/assets/js/08616192.ed0aee9b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1874],{19387:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>l});var i=t(85893),r=t(11151);const s={title:"General concepts"},a=void 0,o={id:"contributing/general-concepts",title:"General concepts",description:"Editor vs Production (how code runs)",source:"@site/docs-classic/contributing/general-concepts.md",sourceDirName:"contributing",slug:"/contributing/general-concepts",permalink:"/contributing/general-concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/contributing/general-concepts.md",tags:[],version:"current",frontMatter:{title:"General concepts"},sidebar:"Contributing",previous:{title:"F# for Darklang developers",permalink:"/contributing/fsharp-for-dark-developers"},next:{title:"A tour of the Backend",permalink:"/contributing/tour-of-backend"}},d={},l=[{value:"Editor vs Production (how code runs)",id:"editor-vs-production-how-code-runs",level:2},{value:"Traces & Live values",id:"traces--live-values",level:2},{value:"Toplevels",id:"toplevels",level:2},{value:"The path of an edit",id:"the-path-of-an-edit",level:2},{value:"Sending the change to the server",id:"sending-the-change-to-the-server",level:3},{value:"ASTs",id:"asts",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"editor-vs-production-how-code-runs",children:"Editor vs Production (how code runs)"}),"\n",(0,i.jsx)(n.p,{children:"Code runs in two places in Darklang: in the Editor, and in Production. In\nproduction, we have a Kubernetes cluster of interpreters with HTTP servers which\nare connected to a database, connected to the internet via Google Cloud\ninfrastructure, that run Darklang programs."}),"\n",(0,i.jsx)(n.p,{children:'When requests are made in production we save their inputs and intermediate\nvalues (combined, these form a "trace", discussed below). Those are sent to the\nclient.'}),"\n",(0,i.jsx)(n.p,{children:"The Darklang interpreter is also compiled to WebAssembly and is available in the\nbrowser in the client. The traces are sent to the WASM-compiled interpreter,\nwhich uses their results to fill in for functions which can't be run on the\nclient (such as DB functions)."}),"\n",(0,i.jsx)(n.h2,{id:"traces--live-values",children:"Traces & Live values"}),"\n",(0,i.jsx)(n.p,{children:"When a request is made to a production server, the inputs (typically a HTTP\nrequest) are saved. We also save intermediate results of functions which are\ncalled during the request. Together, these comprise a trace. Traces are shown in\nthe editor and users can choose between them."}),"\n",(0,i.jsx)(n.h2,{id:"toplevels",children:"Toplevels"}),"\n",(0,i.jsx)(n.p,{children:'"Toplevel" is the generic name for a part of a Darklang program, either a\nhandler (whether a HTTP handler, a Cron or a worker), a function, a type, or a\ndatabase.'}),"\n",(0,i.jsx)(n.p,{children:"Structural toplevels are toplevels which are part of the structure of your\nprogram: handlers and DBs. These live on the canvas."}),"\n",(0,i.jsx)(n.p,{children:'Other toplevels are non-structural, and they don\'t live on the canvas or really\nanywhere. We have started to affectionately refer to the display for these as\nthe "function space". (There is a design for what should happen here, but we\nhave not done it yet).'}),"\n",(0,i.jsx)(n.h2,{id:"the-path-of-an-edit",children:"The path of an edit"}),"\n",(0,i.jsx)(n.p,{children:'Most characters that you type are immediately saved in our production database\n(in, according to our claim, 50ms). Edits are either made to program code, which\nis part of the "Fluid" editing system, or to handlers, databases, function\nparameters, or similar metadata, which is part of the "Forms" editing system\n(originally, all edits were of the "forms" variety - the name was added post-hoc\nto differentiate it from "fluid").'}),"\n",(0,i.jsx)(n.p,{children:"For Fluid, this is the journey:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the event processed by ",(0,i.jsx)(n.code,{children:"FluidKeyboard.res"}),", creating a ",(0,i.jsx)(n.code,{children:"FluidMsg"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fluid.res"})," recognized the ",(0,i.jsx)(n.code,{children:"FluidMsg"}),", calling ",(0,i.jsx)(n.code,{children:"updateKey"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"updateKey"}),' looks at the current caret position, and at the "tokens" before\nand after the caret, to figure out what\'s happening']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"updateKey"})," makes a transformation based on whatever it decided"]}),"\n",(0,i.jsx)(n.li,{children:"the AST for that code is transformed"}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"FluidAutocomplete"})," may be regenerated, if necessary"]}),"\n",(0,i.jsx)(n.li,{children:'the browser\'s animation event fires, causing a re-render. The AST is\n"tokenized", essentially pretty-printing it as HTML, which then renders'}),"\n",(0,i.jsx)(n.li,{children:"an API call is made to send the change to the server (detailed below)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"For forms, the journey is similar:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the event is processed by ",(0,i.jsx)(n.code,{children:"KeyPress.res"})]}),"\n",(0,i.jsxs)(n.li,{children:["the contents of ",(0,i.jsx)(n.code,{children:"m.complete.value"})," are updated (this is where the value in the\nforms box is stored)"]}),"\n",(0,i.jsxs)(n.li,{children:["the ",(0,i.jsx)(n.code,{children:"Autocomplete"})," values are regenerated"]}),"\n",(0,i.jsx)(n.li,{children:"after pressing enter, or clicking away, the change is made"}),"\n",(0,i.jsx)(n.li,{children:"an API call is made to send the change to the server (detailed below)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"sending-the-change-to-the-server",children:"Sending the change to the server"}),"\n",(0,i.jsxs)(n.p,{children:["When a change is made, typically an ",(0,i.jsx)(n.code,{children:"AddOp"})," ",(0,i.jsx)(n.code,{children:"modification"})," is made. That\n",(0,i.jsx)(n.code,{children:"modification"})," is returned by many of the functions that edit programs, and it's\nprocessed in ",(0,i.jsx)(n.code,{children:"Main.res"}),". This passes into ",(0,i.jsx)(n.code,{children:"API.res"}),", where it serializes the\n",(0,i.jsx)(n.code,{children:"Op"})," change into a JSON via encoders (see ",(0,i.jsx)(n.code,{children:"Enconders.res"})," and ",(0,i.jsx)(n.code,{children:"Decoders.res"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["The change is accepted by ",(0,i.jsx)(n.code,{children:"ApiServer.fs"})," in the backend, where it is decoded,\napplied to the program, and then saved into the database. Saving the program\ninvolves a special binary serialization format, in ",(0,i.jsx)(n.code,{children:"BinarySerialization.fs"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"After being saved, it is sent to Pusher.com, the websockets vendor we use. This\nis sent to other clients which then update their programs. It is also sent to\nthe original editor, who ignores it."}),"\n",(0,i.jsx)(n.h2,{id:"asts",children:"ASTs"}),"\n",(0,i.jsx)(n.p,{children:'An "AST" is an "Abstract syntax tree". The simple explanation is that it\'s a set\nof "classes" and "objects" representing programs. (Abstract syntax tree means\nthe programs representation (the "syntax tree") without the annoying syntactic\ndetails like commas and semi-colons (hence "abstract")).'}),"\n",(0,i.jsxs)(n.p,{children:["In Darklang, it's defined in ",(0,i.jsx)(n.code,{children:"FluidExpression.res"}),", and at time of writing looks\nlike this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-fsharp",children:"type sendToRail =\n | Rail\n | NoRail\n\ntype expr =\n | EInteger of id * string\n | EBool of id * bool\n | EString of id * string\n | EFloat of id * string * string\n | ENull of id\n | EBlank of id\n | ELet of id * string * expr * expr\n | EIf of id * expr * expr * expr\n | EBinOp of id * string * expr * expr * sendToRail\n | ELambda of id * (id * string) list * expr\n | EFieldAccess of id * expr * string\n | EVariable of id * string\n | EFnCall of id * string * expr list * sendToRail\n\n | EPartial of id * string * expr\n | ERightPartial of id * string * expr\n | ELeftPartial of id * string * expr\n | EList of id * expr list\n | ERecord of id * (string * expr) list\n | EPipe of id * expr list\n | EConstructor of id * string * expr list\n | EMatch of id * expr * (matchPattern * expr) list\n | EPipeTarget of id\n | EFeatureFlag of id * string * expr * expr * expr\n | ETuple of id * expr * expr * expr list\n\ntype matchPattern =\n | MPNull of id * id\n | MPBlank of id * id\n | MPBool of id * id * bool\n | MPVariable of id * id * string\n | MPInteger of id * id * string\n | MPFloat of id * id * string * string\n | MPString of id * id * string\n | MPConstructor of id * id * string * matchPattern list\n | MPTuple of id * id * matchPattern * matchPattern * matchPattern list\n"})}),"\n",(0,i.jsxs)(n.p,{children:["These definitions are in F# (we have a\n",(0,i.jsx)(n.a,{href:"fsharp-for-dark-developers",children:"guide to F# for Darklang developers"}),"). Briefly,\nthis means that an ",(0,i.jsx)(n.code,{children:"expr"})," is an integer (which is made up of an id and a string)\nor a bool (made up of an id and a string), or a ",(0,i.jsx)(n.code,{children:"match"})," (which is an id, an\nexpression to match on, and a list of patterns and expressions), etc"]}),"\n",(0,i.jsxs)(n.p,{children:["This definition is slightly simplified, but it's close. There's definitions for\nliterals like ints and strings, for definitions like ",(0,i.jsx)(n.code,{children:"let"}),"s, for function calls\nwith ",(0,i.jsx)(n.code,{children:"EBinOp"})," and ",(0,i.jsx)(n.code,{children:"EFnCall"}),", and also for various editor-specific intermediate\nstates like ",(0,i.jsx)(n.code,{children:"EPartial"})," and ",(0,i.jsx)(n.code,{children:"ERightPartial"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Each expression has an ",(0,i.jsx)(n.code,{children:"id"})," that is used to uniquely refer to the expression.\nThis is used when editing programs, and to relate live values from the analysis\nengine to the display in the editor. If an ID is duplicated by accident, the\neditor will act weirdly, but the program will work fine."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"FluidMatchPattern.res"})," and ",(0,i.jsx)(n.code,{children:"FluidExpression.res"})," also contain functions for\nchanging match patterns and expressions easily, either by changing the by ID or\nby traversing across the entire structure. Traversing the structure is generally\npretty fast."]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var i=t(67294);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6426],{24403:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>l});var i=t(74848),r=t(28453);const s={title:"General concepts"},a=void 0,o={id:"contributing/general-concepts",title:"General concepts",description:"Editor vs Production (how code runs)",source:"@site/docs-classic/contributing/general-concepts.md",sourceDirName:"contributing",slug:"/contributing/general-concepts",permalink:"/contributing/general-concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/contributing/general-concepts.md",tags:[],version:"current",frontMatter:{title:"General concepts"},sidebar:"Contributing",previous:{title:"F# for Darklang developers",permalink:"/contributing/fsharp-for-dark-developers"},next:{title:"A tour of the Backend",permalink:"/contributing/tour-of-backend"}},d={},l=[{value:"Editor vs Production (how code runs)",id:"editor-vs-production-how-code-runs",level:2},{value:"Traces & Live values",id:"traces--live-values",level:2},{value:"Toplevels",id:"toplevels",level:2},{value:"The path of an edit",id:"the-path-of-an-edit",level:2},{value:"Sending the change to the server",id:"sending-the-change-to-the-server",level:3},{value:"ASTs",id:"asts",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"editor-vs-production-how-code-runs",children:"Editor vs Production (how code runs)"}),"\n",(0,i.jsx)(n.p,{children:"Code runs in two places in Darklang: in the Editor, and in Production. In\nproduction, we have a Kubernetes cluster of interpreters with HTTP servers which\nare connected to a database, connected to the internet via Google Cloud\ninfrastructure, that run Darklang programs."}),"\n",(0,i.jsx)(n.p,{children:'When requests are made in production we save their inputs and intermediate\nvalues (combined, these form a "trace", discussed below). Those are sent to the\nclient.'}),"\n",(0,i.jsx)(n.p,{children:"The Darklang interpreter is also compiled to WebAssembly and is available in the\nbrowser in the client. The traces are sent to the WASM-compiled interpreter,\nwhich uses their results to fill in for functions which can't be run on the\nclient (such as DB functions)."}),"\n",(0,i.jsx)(n.h2,{id:"traces--live-values",children:"Traces & Live values"}),"\n",(0,i.jsx)(n.p,{children:"When a request is made to a production server, the inputs (typically a HTTP\nrequest) are saved. We also save intermediate results of functions which are\ncalled during the request. Together, these comprise a trace. Traces are shown in\nthe editor and users can choose between them."}),"\n",(0,i.jsx)(n.h2,{id:"toplevels",children:"Toplevels"}),"\n",(0,i.jsx)(n.p,{children:'"Toplevel" is the generic name for a part of a Darklang program, either a\nhandler (whether a HTTP handler, a Cron or a worker), a function, a type, or a\ndatabase.'}),"\n",(0,i.jsx)(n.p,{children:"Structural toplevels are toplevels which are part of the structure of your\nprogram: handlers and DBs. These live on the canvas."}),"\n",(0,i.jsx)(n.p,{children:'Other toplevels are non-structural, and they don\'t live on the canvas or really\nanywhere. We have started to affectionately refer to the display for these as\nthe "function space". (There is a design for what should happen here, but we\nhave not done it yet).'}),"\n",(0,i.jsx)(n.h2,{id:"the-path-of-an-edit",children:"The path of an edit"}),"\n",(0,i.jsx)(n.p,{children:'Most characters that you type are immediately saved in our production database\n(in, according to our claim, 50ms). Edits are either made to program code, which\nis part of the "Fluid" editing system, or to handlers, databases, function\nparameters, or similar metadata, which is part of the "Forms" editing system\n(originally, all edits were of the "forms" variety - the name was added post-hoc\nto differentiate it from "fluid").'}),"\n",(0,i.jsx)(n.p,{children:"For Fluid, this is the journey:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the event processed by ",(0,i.jsx)(n.code,{children:"FluidKeyboard.res"}),", creating a ",(0,i.jsx)(n.code,{children:"FluidMsg"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fluid.res"})," recognized the ",(0,i.jsx)(n.code,{children:"FluidMsg"}),", calling ",(0,i.jsx)(n.code,{children:"updateKey"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"updateKey"}),' looks at the current caret position, and at the "tokens" before\nand after the caret, to figure out what\'s happening']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"updateKey"})," makes a transformation based on whatever it decided"]}),"\n",(0,i.jsx)(n.li,{children:"the AST for that code is transformed"}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"FluidAutocomplete"})," may be regenerated, if necessary"]}),"\n",(0,i.jsx)(n.li,{children:'the browser\'s animation event fires, causing a re-render. The AST is\n"tokenized", essentially pretty-printing it as HTML, which then renders'}),"\n",(0,i.jsx)(n.li,{children:"an API call is made to send the change to the server (detailed below)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"For forms, the journey is similar:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the event is processed by ",(0,i.jsx)(n.code,{children:"KeyPress.res"})]}),"\n",(0,i.jsxs)(n.li,{children:["the contents of ",(0,i.jsx)(n.code,{children:"m.complete.value"})," are updated (this is where the value in the\nforms box is stored)"]}),"\n",(0,i.jsxs)(n.li,{children:["the ",(0,i.jsx)(n.code,{children:"Autocomplete"})," values are regenerated"]}),"\n",(0,i.jsx)(n.li,{children:"after pressing enter, or clicking away, the change is made"}),"\n",(0,i.jsx)(n.li,{children:"an API call is made to send the change to the server (detailed below)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"sending-the-change-to-the-server",children:"Sending the change to the server"}),"\n",(0,i.jsxs)(n.p,{children:["When a change is made, typically an ",(0,i.jsx)(n.code,{children:"AddOp"})," ",(0,i.jsx)(n.code,{children:"modification"})," is made. That\n",(0,i.jsx)(n.code,{children:"modification"})," is returned by many of the functions that edit programs, and it's\nprocessed in ",(0,i.jsx)(n.code,{children:"Main.res"}),". This passes into ",(0,i.jsx)(n.code,{children:"API.res"}),", where it serializes the\n",(0,i.jsx)(n.code,{children:"Op"})," change into a JSON via encoders (see ",(0,i.jsx)(n.code,{children:"Enconders.res"})," and ",(0,i.jsx)(n.code,{children:"Decoders.res"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["The change is accepted by ",(0,i.jsx)(n.code,{children:"ApiServer.fs"})," in the backend, where it is decoded,\napplied to the program, and then saved into the database. Saving the program\ninvolves a special binary serialization format, in ",(0,i.jsx)(n.code,{children:"BinarySerialization.fs"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"After being saved, it is sent to Pusher.com, the websockets vendor we use. This\nis sent to other clients which then update their programs. It is also sent to\nthe original editor, who ignores it."}),"\n",(0,i.jsx)(n.h2,{id:"asts",children:"ASTs"}),"\n",(0,i.jsx)(n.p,{children:'An "AST" is an "Abstract syntax tree". The simple explanation is that it\'s a set\nof "classes" and "objects" representing programs. (Abstract syntax tree means\nthe programs representation (the "syntax tree") without the annoying syntactic\ndetails like commas and semi-colons (hence "abstract")).'}),"\n",(0,i.jsxs)(n.p,{children:["In Darklang, it's defined in ",(0,i.jsx)(n.code,{children:"FluidExpression.res"}),", and at time of writing looks\nlike this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-fsharp",children:"type sendToRail =\n | Rail\n | NoRail\n\ntype expr =\n | EInteger of id * string\n | EBool of id * bool\n | EString of id * string\n | EFloat of id * string * string\n | ENull of id\n | EBlank of id\n | ELet of id * string * expr * expr\n | EIf of id * expr * expr * expr\n | EBinOp of id * string * expr * expr * sendToRail\n | ELambda of id * (id * string) list * expr\n | EFieldAccess of id * expr * string\n | EVariable of id * string\n | EFnCall of id * string * expr list * sendToRail\n\n | EPartial of id * string * expr\n | ERightPartial of id * string * expr\n | ELeftPartial of id * string * expr\n | EList of id * expr list\n | ERecord of id * (string * expr) list\n | EPipe of id * expr list\n | EConstructor of id * string * expr list\n | EMatch of id * expr * (matchPattern * expr) list\n | EPipeTarget of id\n | EFeatureFlag of id * string * expr * expr * expr\n | ETuple of id * expr * expr * expr list\n\ntype matchPattern =\n | MPNull of id * id\n | MPBlank of id * id\n | MPBool of id * id * bool\n | MPVariable of id * id * string\n | MPInteger of id * id * string\n | MPFloat of id * id * string * string\n | MPString of id * id * string\n | MPConstructor of id * id * string * matchPattern list\n | MPTuple of id * id * matchPattern * matchPattern * matchPattern list\n"})}),"\n",(0,i.jsxs)(n.p,{children:["These definitions are in F# (we have a\n",(0,i.jsx)(n.a,{href:"fsharp-for-dark-developers",children:"guide to F# for Darklang developers"}),"). Briefly,\nthis means that an ",(0,i.jsx)(n.code,{children:"expr"})," is an integer (which is made up of an id and a string)\nor a bool (made up of an id and a string), or a ",(0,i.jsx)(n.code,{children:"match"})," (which is an id, an\nexpression to match on, and a list of patterns and expressions), etc"]}),"\n",(0,i.jsxs)(n.p,{children:["This definition is slightly simplified, but it's close. There's definitions for\nliterals like ints and strings, for definitions like ",(0,i.jsx)(n.code,{children:"let"}),"s, for function calls\nwith ",(0,i.jsx)(n.code,{children:"EBinOp"})," and ",(0,i.jsx)(n.code,{children:"EFnCall"}),", and also for various editor-specific intermediate\nstates like ",(0,i.jsx)(n.code,{children:"EPartial"})," and ",(0,i.jsx)(n.code,{children:"ERightPartial"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Each expression has an ",(0,i.jsx)(n.code,{children:"id"})," that is used to uniquely refer to the expression.\nThis is used when editing programs, and to relate live values from the analysis\nengine to the display in the editor. If an ID is duplicated by accident, the\neditor will act weirdly, but the program will work fine."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"FluidMatchPattern.res"})," and ",(0,i.jsx)(n.code,{children:"FluidExpression.res"})," also contain functions for\nchanging match patterns and expressions easily, either by changing the by ID or\nby traversing across the entire structure. Traversing the structure is generally\npretty fast."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(96540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09fa56e2.30423cec.js b/assets/js/09fa56e2.30423cec.js deleted file mode 100644 index 9e13083a6..000000000 --- a/assets/js/09fa56e2.30423cec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[331],{39494:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>h,contentTitle:()=>t,default:()=>o,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var l=s(85893),r=s(11151);const i={},t="Darklang Release 6",a={id:"changelog/release-6",title:"Darklang Release 6",description:"October 1, 2022",source:"@site/docs-classic/changelog/release-6.md",sourceDirName:"changelog",slug:"/changelog/release-6",permalink:"/changelog/release-6",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-6.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 7 - Oct, 2022",permalink:"/changelog/release-7"},next:{title:"Release 5 - Aug, 2022",permalink:"/changelog/release-5"}},h={},d=[{value:"Major features",id:"major-features",level:2},{value:"Support for negative ints and floats",id:"support-for-negative-ints-and-floats",level:3},{value:"Show function deprecation info",id:"show-function-deprecation-info",level:3},{value:"Expression backspacing/conversion",id:"expression-backspacingconversion",level:3},{value:"Editor improvements",id:"editor-improvements",level:2},{value:"Tuples",id:"tuples",level:3},{value:"Strings",id:"strings",level:3},{value:"Live values",id:"live-values",level:3},{value:"Autocomplete",id:"autocomplete",level:3},{value:"Misc Small fixes",id:"misc-small-fixes",level:3},{value:"Standard library changes",id:"standard-library-changes",level:2},{value:"Internal improvements",id:"internal-improvements",level:2}];function c(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e.header,{children:(0,l.jsx)(e.h1,{id:"darklang-release-6",children:"Darklang Release 6"})}),"\n",(0,l.jsx)(e.p,{children:"October 1, 2022"}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["See the ",(0,l.jsx)(e.a,{href:"https://blog.darklang.com/darklang-release-6/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,l.jsx)(e.h2,{id:"major-features",children:"Major features"}),"\n",(0,l.jsx)(e.h3,{id:"support-for-negative-ints-and-floats",children:"Support for negative ints and floats"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Turn existing ints and floats negative by typing ",(0,l.jsx)(e.code,{children:"-"})," in front\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4498",children:"#4498"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/192357264-7ae39197-3ec8-4516-9f43-930817b80b99.gif",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Type negative ints and floats from scratch\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Edit partials and turn them into ints and floats (including negatives)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/192331575-d4affbb3-127c-46c0-8e88-7a74c2e877db.gif",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"show-function-deprecation-info",children:"Show function deprecation info"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Display why functions are deprecated\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/191844123-3c57f9a7-5240-4b84-8691-c91e7b8aee13.png",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"expression-backspacingconversion",children:"Expression backspacing/conversion"}),"\n",(0,l.jsxs)(e.p,{children:["When you delete an ",(0,l.jsx)(e.code,{children:"if"}),", ",(0,l.jsx)(e.code,{children:"match"}),", or lambda (",(0,l.jsx)(e.code,{children:"\\"}),") with one expression, replace\nit with that expression (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4457",children:"#4457"}),")"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/188941656-b0a584be-d115-41cc-a956-28b79646fa89.gif",alt:""})}),"\n",(0,l.jsx)(e.h2,{id:"editor-improvements",children:"Editor improvements"}),"\n",(0,l.jsx)(e.h3,{id:"tuples",children:"Tuples"}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["Tuples are in preview - enable them in ",(0,l.jsx)(e.strong,{children:"Settings/Contributor Settings"})]})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show Tuple2 and Tuple3 functions in the autocomplete\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4482",children:"#4482"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add tuple pattern autocomplete completion\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4465",children:"#4465"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/906686/189388902-82bf765f-a9f4-4629-9fda-8f99918d259c.gif",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow copy/pasting tuple patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4469",children:"#4469"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow you to press ",(0,l.jsx)(e.code,{children:")"})," to go over a tuple's closing parenthesis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4454",children:"#4454"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Put cursor at ",(0,l.jsx)(e.em,{children:"start"})," of blank tuple pattern when removing elements\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4455",children:"#4455"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't allow tuple pattern parts to be overwritten by literals\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4453",children:"#4453"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"strings",children:"Strings"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["indent one more space to line up multiline strings\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4477",children:"#4477"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["show slight background in strings to help see how they line up (it's subtle!)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4479",children:"#4479"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4477",children:"#4477"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/190904975-276ea41d-5880-460f-b68f-fedc70b1a0e1.png",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"live-values",children:"Live values"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show live values for lambdas properly (actually trace them and then display\nthem)) (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Display a lambda's runtime value as a live value\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/188888447-62103469-5f6b-4eec-a4d3-fcc8f0fd9764.png",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show live values for literals instead of a spinner\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Correctly show analysis for partials (the old value)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show the correct live value for let definitions and record field names\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show pipe live value for current pipe entry\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't spin when there's a pipe in a blank\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"autocomplete",children:"Autocomplete"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix some standard library function descriptions - typos and punctuation\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Better UI when a function has no description (affects functions in the package\nmanager) (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix fluid pattern autocomplete flashing\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4462",children:"#4462"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix bug when going further than 3 places down in the autocomplete for patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4462",children:"#4462"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't confuse secrets and datastores\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"misc-small-fixes",children:"Misc Small fixes"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix a few places secrets weren't hidden\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow users to use deprecated functions they already use in more cases\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4482",children:"#4482"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Error messages use less ugly representation of dicts and lists\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Hide irrelevent GC error in analysis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4505",children:"#4505"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4483",children:"#4483"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4449",children:"#4449"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:['When a handler\'s route changes, update "open-in-new-window" to use the new\nroute (',(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4502",children:"#4502"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["don't insert ",(0,l.jsx)(e.code,{children:"0"})," when copy/pasting from the start of ints in patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4492",children:"#4492"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't create empty patterns when creating match\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4469",children:"#4469"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["put the cursor in right place after a string edit\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["convert partials to ints and floats\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["fix broken floats automatically\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"standard-library-changes",children:"Standard library changes"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Add ",(0,l.jsx)(e.code,{children:"Uuid::parse_v0"})," and deprecate ",(0,l.jsx)(e.code,{children:"String::toUUID"}),"\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4480",children:"#4480"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"internal-improvements",children:"Internal improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["The dark repo is now\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/tags",children:"tagged for each release"})]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add IDs to debugger AST view\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["A number of fixes related to lambdas\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Rebrand 'pattern' as 'match pattern' throughout client codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4487",children:"#4487"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor function representation\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4485",children:"#4485"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Use IDs more (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4480",children:"#4480"}),")"]}),"\n"]}),"\n"]})]})}function o(n={}){const{wrapper:e}={...(0,r.a)(),...n.components};return e?(0,l.jsx)(e,{...n,children:(0,l.jsx)(c,{...n})}):c(n)}},11151:(n,e,s)=>{s.d(e,{Z:()=>a,a:()=>t});var l=s(67294);const r={},i=l.createContext(r);function t(n){const e=l.useContext(i);return l.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:t(n.components),l.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/09fa56e2.dbcf631a.js b/assets/js/09fa56e2.dbcf631a.js new file mode 100644 index 000000000..f405126ad --- /dev/null +++ b/assets/js/09fa56e2.dbcf631a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7605],{25159:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>h,contentTitle:()=>t,default:()=>o,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var l=s(74848),r=s(28453);const i={},t="Darklang Release 6",a={id:"changelog/release-6",title:"Darklang Release 6",description:"October 1, 2022",source:"@site/docs-classic/changelog/release-6.md",sourceDirName:"changelog",slug:"/changelog/release-6",permalink:"/changelog/release-6",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-6.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 7 - Oct, 2022",permalink:"/changelog/release-7"},next:{title:"Release 5 - Aug, 2022",permalink:"/changelog/release-5"}},h={},d=[{value:"Major features",id:"major-features",level:2},{value:"Support for negative ints and floats",id:"support-for-negative-ints-and-floats",level:3},{value:"Show function deprecation info",id:"show-function-deprecation-info",level:3},{value:"Expression backspacing/conversion",id:"expression-backspacingconversion",level:3},{value:"Editor improvements",id:"editor-improvements",level:2},{value:"Tuples",id:"tuples",level:3},{value:"Strings",id:"strings",level:3},{value:"Live values",id:"live-values",level:3},{value:"Autocomplete",id:"autocomplete",level:3},{value:"Misc Small fixes",id:"misc-small-fixes",level:3},{value:"Standard library changes",id:"standard-library-changes",level:2},{value:"Internal improvements",id:"internal-improvements",level:2}];function c(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e.header,{children:(0,l.jsx)(e.h1,{id:"darklang-release-6",children:"Darklang Release 6"})}),"\n",(0,l.jsx)(e.p,{children:"October 1, 2022"}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["See the ",(0,l.jsx)(e.a,{href:"https://blog.darklang.com/darklang-release-6/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,l.jsx)(e.h2,{id:"major-features",children:"Major features"}),"\n",(0,l.jsx)(e.h3,{id:"support-for-negative-ints-and-floats",children:"Support for negative ints and floats"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Turn existing ints and floats negative by typing ",(0,l.jsx)(e.code,{children:"-"})," in front\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4498",children:"#4498"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/192357264-7ae39197-3ec8-4516-9f43-930817b80b99.gif",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Type negative ints and floats from scratch\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Edit partials and turn them into ints and floats (including negatives)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/192331575-d4affbb3-127c-46c0-8e88-7a74c2e877db.gif",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"show-function-deprecation-info",children:"Show function deprecation info"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Display why functions are deprecated\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/191844123-3c57f9a7-5240-4b84-8691-c91e7b8aee13.png",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"expression-backspacingconversion",children:"Expression backspacing/conversion"}),"\n",(0,l.jsxs)(e.p,{children:["When you delete an ",(0,l.jsx)(e.code,{children:"if"}),", ",(0,l.jsx)(e.code,{children:"match"}),", or lambda (",(0,l.jsx)(e.code,{children:"\\"}),") with one expression, replace\nit with that expression (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4457",children:"#4457"}),")"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/188941656-b0a584be-d115-41cc-a956-28b79646fa89.gif",alt:""})}),"\n",(0,l.jsx)(e.h2,{id:"editor-improvements",children:"Editor improvements"}),"\n",(0,l.jsx)(e.h3,{id:"tuples",children:"Tuples"}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.em,{children:["Tuples are in preview - enable them in ",(0,l.jsx)(e.strong,{children:"Settings/Contributor Settings"})]})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show Tuple2 and Tuple3 functions in the autocomplete\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4482",children:"#4482"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add tuple pattern autocomplete completion\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4465",children:"#4465"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/906686/189388902-82bf765f-a9f4-4629-9fda-8f99918d259c.gif",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow copy/pasting tuple patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4469",children:"#4469"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow you to press ",(0,l.jsx)(e.code,{children:")"})," to go over a tuple's closing parenthesis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4454",children:"#4454"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Put cursor at ",(0,l.jsx)(e.em,{children:"start"})," of blank tuple pattern when removing elements\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4455",children:"#4455"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't allow tuple pattern parts to be overwritten by literals\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4453",children:"#4453"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"strings",children:"Strings"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["indent one more space to line up multiline strings\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4477",children:"#4477"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["show slight background in strings to help see how they line up (it's subtle!)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4479",children:"#4479"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4477",children:"#4477"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/190904975-276ea41d-5880-460f-b68f-fedc70b1a0e1.png",alt:""})}),"\n",(0,l.jsx)(e.h3,{id:"live-values",children:"Live values"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show live values for lambdas properly (actually trace them and then display\nthem)) (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Display a lambda's runtime value as a live value\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsx)(e.img,{src:"https://user-images.githubusercontent.com/181762/188888447-62103469-5f6b-4eec-a4d3-fcc8f0fd9764.png",alt:""})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show live values for literals instead of a spinner\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Correctly show analysis for partials (the old value)\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show the correct live value for let definitions and record field names\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Show pipe live value for current pipe entry\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't spin when there's a pipe in a blank\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"autocomplete",children:"Autocomplete"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix some standard library function descriptions - typos and punctuation\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Better UI when a function has no description (affects functions in the package\nmanager) (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix fluid pattern autocomplete flashing\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4462",children:"#4462"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix bug when going further than 3 places down in the autocomplete for patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4462",children:"#4462"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't confuse secrets and datastores\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"misc-small-fixes",children:"Misc Small fixes"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Fix a few places secrets weren't hidden\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Allow users to use deprecated functions they already use in more cases\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4482",children:"#4482"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Error messages use less ugly representation of dicts and lists\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Hide irrelevent GC error in analysis\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4505",children:"#4505"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4483",children:"#4483"}),",\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4449",children:"#4449"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:['When a handler\'s route changes, update "open-in-new-window" to use the new\nroute (',(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4502",children:"#4502"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["don't insert ",(0,l.jsx)(e.code,{children:"0"})," when copy/pasting from the start of ints in patterns\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4492",children:"#4492"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Don't create empty patterns when creating match\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4469",children:"#4469"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["put the cursor in right place after a string edit\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["convert partials to ints and floats\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["fix broken floats automatically\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4497",children:"#4497"}),")"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"standard-library-changes",children:"Standard library changes"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Add ",(0,l.jsx)(e.code,{children:"Uuid::parse_v0"})," and deprecate ",(0,l.jsx)(e.code,{children:"String::toUUID"}),"\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4480",children:"#4480"}),")"]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"internal-improvements",children:"Internal improvements"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["The dark repo is now\n",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/tags",children:"tagged for each release"})]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Add IDs to debugger AST view\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4491",children:"#4491"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["A number of fixes related to lambdas\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4456",children:"#4456"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Rebrand 'pattern' as 'match pattern' throughout client codebase\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4487",children:"#4487"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Refactor function representation\n(",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4485",children:"#4485"}),")"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["\n",(0,l.jsxs)(e.p,{children:["Use IDs more (",(0,l.jsx)(e.a,{href:"https://github.com/darklang/dark/pull/4480",children:"#4480"}),")"]}),"\n"]}),"\n"]})]})}function o(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,l.jsx)(e,{...n,children:(0,l.jsx)(c,{...n})}):c(n)}},28453:(n,e,s)=>{s.d(e,{R:()=>t,x:()=>a});var l=s(96540);const r={},i=l.createContext(r);function t(n){const e=l.useContext(i);return l.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:t(n.components),l.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aa21778.4eaace20.js b/assets/js/0aa21778.4eaace20.js new file mode 100644 index 000000000..7cec7cfa1 --- /dev/null +++ b/assets/js/0aa21778.4eaace20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4694],{85898:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var t=s(74848),a=s(28453);const i={id:"languagedetails",title:"Language Details",sidebar_label:"Language Details"},r=void 0,l={id:"reference/languagedetails",title:"Language Details",description:"This doc describes the Darklang language. Darklang is really a system - a",source:"@site/docs-classic/reference/languagedetails.md",sourceDirName:"reference",slug:"/reference/languagedetails",permalink:"/reference/languagedetails",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/languagedetails.md",tags:[],version:"current",frontMatter:{id:"languagedetails",title:"Language Details",sidebar_label:"Language Details"},sidebar:"docs",previous:{title:"Sample Canvases",permalink:"/reference/sample-canvases"},next:{title:"Keyboard Mapping",permalink:"/reference/keyboard-mapping"}},o={},d=[{value:"Type system",id:"type-system",level:3},{value:"Built-in types",id:"built-in-types",level:2},{value:"Integers",id:"integers",level:3},{value:"Floats",id:"floats",level:3},{value:"Booleans",id:"booleans",level:3},{value:"Strings",id:"strings",level:3},{value:"Characters",id:"characters",level:3},{value:"Lists/Arrays",id:"listsarrays",level:3},{value:"Tuples (In-Progress)",id:"tuples-in-progress",level:3},{value:"Binary",id:"binary",level:3},{value:"Options",id:"options",level:3},{value:"Results",id:"results",level:3},{value:"Dicts",id:"dicts",level:3},{value:"UUID",id:"uuid",level:3},{value:"Null",id:"null",level:3},{value:"User defined types",id:"user-defined-types",level:2},{value:"Records",id:"records",level:3},{value:"Enums",id:"enums",level:3},{value:"Types unique to Darklang",id:"types-unique-to-darklang",level:2},{value:"Incompletes",id:"incompletes",level:3},{value:"Error rail",id:"error-rail",level:3},{value:"Sensitive Types",id:"sensitive-types",level:3},{value:"Expressions",id:"expressions",level:2},{value:"Let",id:"let",level:3},{value:"Variable Scope",id:"variable-scope",level:4},{value:"If",id:"if",level:3},{value:"Match",id:"match",level:3},{value:"Functions",id:"functions",level:3},{value:"Lambda",id:"lambda",level:3},{value:"Pipelining",id:"pipelining",level:3},{value:"Feature Flags",id:"feature-flags",level:3},{value:"Planned language features",id:"planned-language-features",level:2},{value:"Sets",id:"sets",level:3},{value:"Unit",id:"unit",level:3},{value:"Imperative programming (Statements and refs)",id:"imperative-programming-statements-and-refs",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This doc describes the Darklang language. Darklang is really a system - a\ncombination of the language, editor, framework and infrastructure. In this doc,\nwe'll focus on discussing the language itself, ignoring where possible the\neditor and infrastructure."}),"\n",(0,t.jsxs)(n.p,{children:["This discusses both the language and the ",(0,t.jsx)(n.strong,{children:"intended"})," language. We have taken\nmany shortcuts to be able to ship Darklang, and so many parts of the language\nare not currently at their end state. Here we discuss both what the language is,\nand what we intend it to be."]}),"\n",(0,t.jsx)(n.p,{children:"Darklang is a statically-typed functional/imperative hybrid, based loosely on\nML. It is a high-level language, with immutable values, garbage collection, and\nsupport for generics/polymorphic types."}),"\n",(0,t.jsx)(n.p,{children:"Darklang is somewhat similar to OCaml or Elm. It has many similarities to Rust\nand Haskell, and is also influenced by Clojure, Ruby, Python, CoffeeScript, as\nwell as our experience with (alphabetically) Bash, C, Clojure, CoffeeScript,\nC++, Elm, Javascript, Java, Haskell, OCaml, Perl, PHP, Python, ReasonML,\nRuby/Rails, React, and Rust."}),"\n",(0,t.jsx)(n.h3,{id:"type-system",children:"Type system"}),"\n",(0,t.jsx)(n.p,{children:"Dark\u2019s type system is most similar to Elm, Haskell, ReasonML, OCaml or Rust:\nbased on records, enums, list, and built-in generics/polymorphism. All values in\nDarklang are immutable, except refs."}),"\n",(0,t.jsxs)(n.p,{children:["Darklang has some standard basic types: ",(0,t.jsx)(n.code,{children:"int"}),", ",(0,t.jsx)(n.code,{children:"string"}),", ",(0,t.jsx)(n.code,{children:"boolean"}),", ",(0,t.jsx)(n.code,{children:"float"}),",\n",(0,t.jsx)(n.code,{children:"list"}),", and ",(0,t.jsx)(n.code,{children:"dicts"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["We support typical functional types: ",(0,t.jsx)(n.code,{children:"Option"})," and ",(0,t.jsx)(n.code,{children:"Result"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Currently, Darklang has a ",(0,t.jsx)(n.code,{children:"null"})," type to support JSON values directly. In the\nfuture, we intend to deprecate ",(0,t.jsx)(n.code,{children:"null"})," and replace it with ",(0,t.jsx)(n.code,{children:"Options"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"built-in-types",children:"Built-in types"}),"\n",(0,t.jsx)(n.h3,{id:"integers",children:"Integers"}),"\n",(0,t.jsx)(n.p,{children:"Integers are signed 63-bit integer."}),"\n",(0,t.jsx)(n.p,{children:"In the future, Darklang will use infinite-precision integers. We also intend to\nadd unsigned 8-bit integers and bit-manipulation functions."}),"\n",(0,t.jsx)(n.h3,{id:"floats",children:"Floats"}),"\n",(0,t.jsx)(n.p,{children:"Floats are double-precision 64-bit floating-point values (IEEE 754)."}),"\n",(0,t.jsxs)(n.p,{children:["We intend for numeric operations to return Results, to handle situations which\nare undefined on the datatype. For example, integer division would return\n",(0,t.jsx)(n.code,{children:"Result Error Int"}),". Similarly, floating point values would never be ",(0,t.jsx)(n.code,{children:"NaN"}),", and\ninstead would return ",(0,t.jsx)(n.code,{children:"Result Error Float"}),". See\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Handling in Darklang"}),"\nfor more."]}),"\n",(0,t.jsx)(n.h3,{id:"booleans",children:"Booleans"}),"\n",(0,t.jsx)(n.p,{children:"Booleans are true or false."}),"\n",(0,t.jsx)(n.h3,{id:"strings",children:"Strings"}),"\n",(0,t.jsx)(n.p,{children:"Strings are unicode, and character are unicode \u201ccharacters\u201d (if it appears as\none character on the screen, that\u2019s a \u201ccharacter\u201d in Darklang)."}),"\n",(0,t.jsx)(n.p,{children:"Specifically, string are immutable UTF-8 encoded sequences of Unicode code\npoints. Chars are \u201cExtended Grapheme Clusters\u201d. (A codepoint is some bytes that\nimplement unicode characters, a grapheme is some codepoints forming a unicode\nentity, such as an emoji; an EGC is some graphemes, used to handle things like\nemojis which combine to form a single emoji)."}),"\n",(0,t.jsx)(n.p,{children:"Darklang doesn't currently support string interpolation, but we plan to in the\nfuture."}),"\n",(0,t.jsx)(n.h3,{id:"characters",children:"Characters"}),"\n",(0,t.jsxs)(n.p,{children:["A character in Darklang represents a character that you see on your screen, such\nas ",(0,t.jsx)(n.code,{children:"'a'"}),", ",(0,t.jsx)(n.code,{children:"'1'"}),", ",(0,t.jsx)(n.code,{children:"'\u017b'"}),", ",(0,t.jsx)(n.code,{children:"'\ud83c\uddf5\ud83c\uddf7'"}),", ",(0,t.jsx)(n.code,{children:"'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66'"}),". This is in contrast to most languages,\nwhere a character represents one byte, or perhaps a Unicode codepoint. We chose\nthis"]}),"\n",(0,t.jsxs)(n.p,{children:["The technical name for a Darklang character is an ",(0,t.jsx)(n.em,{children:"Extended Grapheme Cluster"}),",\nand can best be thought of as supporting the entire character you see in front\nof you - in the case of emoji, this includes such things as combining characters\nand skin tones. See [Strings](### Strings) above for additional context."]}),"\n",(0,t.jsxs)(n.p,{children:["While the Darklang language has support for Characters, the Editor experience\nwith Characters is quite limited. For example, we do not yet support Character\nliterals using single quotes, such as ",(0,t.jsx)(n.code,{children:"'a'"}),". Until proper support exists, you\ncan define a Char in Darklang rather indirectly:\n",(0,t.jsx)(n.code,{children:'let charExample = "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" |> String::toList |> List.head'}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"listsarrays",children:"Lists/Arrays"}),"\n",(0,t.jsx)(n.p,{children:"Lists and Arrays use the same datatype, called Lists. The Darklang compiler will\nin the future optimize their implementation to support good algorithmic\ncomplexity and performance for whatever you use them for."}),"\n",(0,t.jsx)(n.p,{children:"Lists should be used for all \u201cI want a sequence of things\u201d situations, including\niterating across them, random access, push/pop, etc."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"let x = [8]\nlet y = List::append x [6]\ny\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"[8, 6]\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"List Example",src:s(19815).A+"",width:"994",height:"200"})}),"\n",(0,t.jsx)(n.h3,{id:"tuples-in-progress",children:"Tuples (In-Progress)"}),"\n",(0,t.jsx)(n.p,{children:"Darklang supports tuples: lists of defined length supporting heterogeneous\ntypes."}),"\n",(0,t.jsxs)(n.p,{children:["Tuple support is currently a\n",(0,t.jsx)(n.a,{href:"https://github.com/darklang/dark/issues/4265",children:"work-in-progress"}),", and only\navailable in the editor after opting in via the Settings dialog. Feedback is\nwelcome!"]}),"\n",(0,t.jsxs)(n.p,{children:["See Release 5 in the ",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/changelog",children:"changelog"}),"\nfor a demo of opting in."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let x = (1, "string", { name: "Sam" })\n'})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Tuples can be created in the editor by entering ",(0,t.jsx)(n.code,{children:"("})," in a blank."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Inserting additional separators (",(0,t.jsx)(n.code,{children:","}),") extends the size of the tuple; removing\nseparators/elements reduces the size, generally removing the element to the\nleft of the separator"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Darklang's Standard Library includes ",(0,t.jsx)(n.code,{children:"Tuple2"})," and ",(0,t.jsx)(n.code,{children:"Tuple3"})," modules, which\nprovide functions used to work with tuples of size 2 and 3."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Pattern matching with ",(0,t.jsx)(n.code,{children:"match"})," supports tuples:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let headers = Dict::toList request.headers\nlet contentTypePlain =\n List::findFirst headers \\header ->\n let (key, value) = Tuple2::mapFirst (\\key -> String::toLower key) header\n match (key, value)\n ("content-type", "application/json") -> Just "json"\n ("content-type", "text/html") -> Just "html"\n _ -> Nothing\n'})}),"\n",(0,t.jsx)(n.p,{children:"Tuple match patterns can be created and extended the same way as tuple\nexpressions."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The following constructs are planned but not yet implemented:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Tuples can be deconstructed into their parts via a ",(0,t.jsx)(n.code,{children:"let"})," expression:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:"let philadelphia = (39.9526, 75.1652)\nlet (lat, long) = philadelphia\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"User functions may accept and return Tuples (TODO: I'm not sure how to phrase\nthis)"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"binary",children:"Binary"}),"\n",(0,t.jsxs)(n.p,{children:["Non-unicode sequences of bytes are supported as the ",(0,t.jsx)(n.code,{children:"Binary"})," type."]}),"\n",(0,t.jsx)(n.h3,{id:"options",children:"Options"}),"\n",(0,t.jsx)(n.p,{children:"Instead of allowing all values to potentially be null, as in most imperative\nlanguages, Darklang uses an Option type:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"Option a = Just a | Nothing\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Option Example",src:s(18276).A+"",width:"1374",height:"402"})}),"\n",(0,t.jsx)(n.p,{children:"This is intended to convert effortlessly to null in JSON, but we don't quite\nhave enough of the type system to remove null, so they both exist right now."}),"\n",(0,t.jsxs)(n.p,{children:["Functions which return ",(0,t.jsx)(n.code,{children:"Option"})," trigger the\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Rail"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"results",children:"Results"}),"\n",(0,t.jsx)(n.p,{children:"Any functions which can have an error should use Results. We use results for Int\ndivision, Float operations, HTTP operations, etc."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"Result a = Ok a | Err Error\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Darklang has no exceptions - all errors go through Results. See\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"error handling"})," for more\ndetails."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Result Example",src:s(36580).A+"",width:"1376",height:"414"})}),"\n",(0,t.jsx)(n.h3,{id:"dicts",children:"Dicts"}),"\n",(0,t.jsx)(n.p,{children:"Dicts are maps from a certain key type to a certain value type. The key must\ncurrently be a string. The value can be any type but all elements of the Dict\nare the same type (not currently enforced)."}),"\n",(0,t.jsx)(n.p,{children:"Dicts are different than records: dicts can have arbitrary keys."}),"\n",(0,t.jsx)(n.h3,{id:"uuid",children:"UUID"}),"\n",(0,t.jsx)(n.p,{children:"Darklang supports UUIDs directly."}),"\n",(0,t.jsx)(n.h3,{id:"null",children:"Null"}),"\n",(0,t.jsxs)(n.p,{children:["As a temporary hack, Darklang also supports ",(0,t.jsx)(n.code,{children:"null"}),". This allows us handle JSON\nwhile we build out enough type-system support to allow them to be replaced by\n",(0,t.jsx)(n.code,{children:"Option"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"Null"})," is mostly useful for comparing against incoming JSON and results of\n",(0,t.jsx)(n.code,{children:"HttpClient"})," calls. When returning JSON or making ",(0,t.jsx)(n.code,{children:"HttpClient"})," calls, you can\nuse ",(0,t.jsx)(n.code,{children:"Option"}),"s instead and they will be converted properly to ",(0,t.jsx)(n.code,{children:"null"})," in the JSON\noutput."]}),"\n",(0,t.jsx)(n.h2,{id:"user-defined-types",children:"User defined types"}),"\n",(0,t.jsx)(n.p,{children:"Darklang currently has limited support for user-defined types. Currently, we\nsupport inline definition of records, but do not support defining record types\nexplicitly."}),"\n",(0,t.jsx)(n.p,{children:"Record types are actually implemented under the hood, and we intend to use them\nto support typed Datastores, API contracts, and static types."}),"\n",(0,t.jsx)(n.p,{children:"Darklang does not currently support user-defined enums."}),"\n",(0,t.jsx)(n.p,{children:"User-defined types will be either records or enums, or combinations of other\ntype expressions."}),"\n",(0,t.jsx)(n.p,{children:"Types in Darklang are out-of-line, meaning that they are not defined \u201con the\ncanvas\u201d, in a similar way to functions."}),"\n",(0,t.jsx)(n.p,{children:"All types in Darklang will be versioned."}),"\n",(0,t.jsx)(n.p,{children:"In the future, we intend to support typeclasses or traits to allow ad-hoc\npolymorphism."}),"\n",(0,t.jsx)(n.h3,{id:"records",children:"Records"}),"\n",(0,t.jsx)(n.p,{children:"Records are most akin to Classes in an imperative language."}),"\n",(0,t.jsx)(n.p,{children:"Records are a set of keys and values. Each key name and type are defined, and\nthe types do not have to be the same."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'let x = { name: "Robin"\n age: 32\n gender: "Other"\n }\n'})}),"\n",(0,t.jsx)(n.p,{children:"Records can not be accessed dynamically; they are not Maps/Hashtables/Dicts."}),"\n",(0,t.jsx)(n.p,{children:"Records are structurally typed, and are equivalent to records of the same shape\nbut a different name."}),"\n",(0,t.jsx)(n.p,{children:"Note that at the moment, Dicts and Records share the same implementation and can\nbe accessed and modified in the same way. We intend to break these apart in the\nfuture."}),"\n",(0,t.jsx)(n.h3,{id:"enums",children:"Enums"}),"\n",(0,t.jsx)(n.p,{children:"Enums are a set of \u201cconstructors\u201d, each of which has a set of typed arguments."}),"\n",(0,t.jsxs)(n.p,{children:["Currently, Darklang only supports ",(0,t.jsx)(n.code,{children:"Option"})," and ",(0,t.jsx)(n.code,{children:"Result"})," built-in enums. In the\nfuture, we will support user-defined enums."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"type Person = Human {age: Int, name: String, itin: String }\n | Corporation {age: Int, name: String, ein: String }\n | Puppers Int String\n"})}),"\n",(0,t.jsx)(n.p,{children:"Enums can be made by building on existing types, especially records and other\nenums."}),"\n",(0,t.jsx)(n.p,{children:"Enums are nominally typed. (Two enums with the same field names and types are\nnot equivalent)."}),"\n",(0,t.jsx)(n.h2,{id:"types-unique-to-darklang",children:"Types unique to Darklang"}),"\n",(0,t.jsx)(n.h3,{id:"incompletes",children:"Incompletes"}),"\n",(0,t.jsx)(n.p,{children:"Programs in Darklang start as a single empty expression. As they get built up in\nour structured editor, they can never become syntactically invalid. However, a\nprogram may be incomplete if any its expressions are empty."}),"\n",(0,t.jsx)(n.p,{children:"An empty expression is incomplete. A developer may write programs where some\nparts are incomplete as they build out the code. As such, incomplete values\nappear dynamically when the code is executed. Structures containing incompletes\nare themselves incomplete. For example functions with incomplete arguments do\nnot execute, and return incomplete; and records with an incomplete field are\nalso incomplete."}),"\n",(0,t.jsx)(n.p,{children:"Incompletes are never returned to end users, and cannot be stored in a\ndatastore. Returning an incomplete via a HTTP handler causes a 500 error."}),"\n",(0,t.jsx)(n.h3,{id:"error-rail",children:"Error rail"}),"\n",(0,t.jsxs)(n.p,{children:["You might occasionally see a value marked ",(0,t.jsx)(n.code,{children:""}),", this is used to\nindicate that a value is on the Error Rail. See\n",(0,t.jsx)(n.a,{href:"https://blog.darklang.com/real-problems-with-functional-languages/",children:"Railway Oriented Programming"}),"\nfor more details."]}),"\n",(0,t.jsx)(n.h3,{id:"sensitive-types",children:"Sensitive Types"}),"\n",(0,t.jsx)(n.p,{children:"Some values are sensitive, for example, passwords or credit card numbers."}),"\n",(0,t.jsxs)(n.p,{children:["Currently Darklang supports the ",(0,t.jsx)(n.code,{children:"Password"})," type, which is never saved directly\nor sent to the editor."]}),"\n",(0,t.jsx)(n.p,{children:"In the future, Darklang will allow you to specify types of sensitive values,\npreventing them from being stored in logs, and allowing a team to limit who has\naccess to these values in the Darklang editor."}),"\n",(0,t.jsx)(n.h2,{id:"expressions",children:"Expressions"}),"\n",(0,t.jsx)(n.p,{children:"All Darklang language constructs are expressions. That means that they evaluate\nto a value, rather than being used to set state."}),"\n",(0,t.jsx)(n.h3,{id:"let",children:"Let"}),"\n",(0,t.jsx)(n.p,{children:"Lets creates a name with an immutable value, and a scope in which that is\ndefined."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'let name = "Stella"\nname\n'})}),"\n",(0,t.jsx)(n.p,{children:"We often refer to these names as variables, for simplicity. However, they never\nvary: once they are defined, they never have any other value."}),"\n",(0,t.jsx)(n.h4,{id:"variable-scope",children:"Variable Scope"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"if age > 18\nthen\n let height = 170\n height + 12\nelse\n let weight = 105\n weight / 2\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the scope of ",(0,t.jsx)(n.code,{children:"height"})," and ",(0,t.jsx)(n.code,{children:"weight"})," only extends to within\nthe ",(0,t.jsx)(n.code,{children:"then"})," block and ",(0,t.jsx)(n.code,{children:"else"})," block respectively. You cannot use either variable\nbelow the ",(0,t.jsx)(n.code,{children:"if"})," expression."]}),"\n",(0,t.jsx)(n.h3,{id:"if",children:"If"}),"\n",(0,t.jsxs)(n.p,{children:["Darklang supports if/else statement. The argument to an ",(0,t.jsx)(n.code,{children:"if"})," is a boolean. We\ncurrently support ",(0,t.jsx)(n.code,{children:"truthy"})," types but intend to remove that ability."]}),"\n",(0,t.jsxs)(n.p,{children:["We support ",(0,t.jsx)(n.code,{children:"&&"})," and ",(0,t.jsx)(n.code,{children:"||"}),", which short-circuit (only evaluate the second\nexpression if needed). However, we used to support versions of ",(0,t.jsx)(n.code,{children:"&&"})," and ",(0,t.jsx)(n.code,{children:"||"}),"\nthat did not short-circuit; those are deprecated (the editor will show\ndocumentation about how to move to the new versions)."]}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"if"})," is not currently allowed without a corresponding ",(0,t.jsx)(n.code,{children:"else"})," - we will relax\nthis after we introduce statements."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"If Example",src:s(19722).A+"",width:"1384",height:"394"})}),"\n",(0,t.jsx)(n.h3,{id:"match",children:"Match"}),"\n",(0,t.jsxs)(n.p,{children:["Darklang supports pattern matching, in particular, matching on ",(0,t.jsx)(n.code,{children:"Enum"}),"s."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let introduction =\n match name with\n | Nothing -> "Hi!"\n | Just name -> "Dear " ++ name\n'})}),"\n",(0,t.jsxs)(n.p,{children:["We expect to allow guards in the future. We also hope to add an ",(0,t.jsx)(n.code,{children:"if-let"}),"\nconstruct to support ",(0,t.jsx)(n.code,{children:"if"})," statements that destructure from Enums."]}),"\n",(0,t.jsx)(n.h3,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.p,{children:"Functions must have type declarations for inputs. We intend to support types on\nreturn values soon."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"fetch url name =\n { url: url\n , name: name\n }\n"})}),"\n",(0,t.jsx)(n.p,{children:"Functions in Darklang are simple, and do not currently support functional\nlanguage concepts, such as partial application, functions as first-class values,\nand defining functions in using points-free style."}),"\n",(0,t.jsx)(n.p,{children:"Functions do not live in the \u201cCanvas\u201d, but rather are a little bit ethereal."}),"\n",(0,t.jsxs)(n.p,{children:["Built-in functions are all versioned: we frequently deprecate old functions and\nadd updates. When we deprecate old versions, your code does ",(0,t.jsx)(n.em,{children:"not"})," change, and\nyou keep using the old ones. We intend to support automated refactoring and\nupdating in the future."]}),"\n",(0,t.jsx)(n.p,{children:"In the future, we intend to support partial application/currying, and\ndefault/optional parameters."}),"\n",(0,t.jsx)(n.h3,{id:"lambda",children:"Lambda"}),"\n",(0,t.jsxs)(n.p,{children:["Lambdas are anonymous functions. They are used to pass to functions which take\n",(0,t.jsx)(n.code,{children:"Block"}),"s, typically used for iteration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"List::map [5, 10, 11] \\var -> var + 2\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"[7, 12, 13]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the future, we intend to support a syntax for shorthands for creating lambdas\nto access fields: ",(0,t.jsx)(n.code,{children:".fieldname"}),". This can be included in a pipe or used as a\nfirst class function."]}),"\n",(0,t.jsx)(n.p,{children:"We also intend to support passing functions where blocks are expected."}),"\n",(0,t.jsxs)(n.p,{children:["There is a syntax for shorthands for creating lambda\u2019s to call constructors:\n",(0,t.jsx)(n.code,{children:"ConstructorName"}),". This can be included in a pipe or used as a first class\nfunction."]}),"\n",(0,t.jsx)(n.h3,{id:"pipelining",children:"Pipelining"}),"\n",(0,t.jsx)(n.p,{children:"Darklang programs are intended to be written, as much as possible, as pipelines\nof data:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'user\n|> getFriends\n|> List.map (\\f -> (f, getFriends f))\n|> List.filter (\\f -> f.name == "Kevin Bacon")\n|> (=) []\n'})}),"\n",(0,t.jsx)(n.h3,{id:"feature-flags",children:"Feature Flags"}),"\n",(0,t.jsxs)(n.p,{children:["Feature flags are similar to ",(0,t.jsx)(n.code,{children:"if"}),"s:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"flag myCondition\nthen 5\nelse 6\n"})}),"\n",(0,t.jsxs)(n.p,{children:["However, flags differ slightly from ifs in that any condition that is not ",(0,t.jsx)(n.code,{children:"true"}),"\nwill cause the ",(0,t.jsx)(n.code,{children:"then"})," block to activate. This is especially important around\n",(0,t.jsx)(n.code,{children:"incomplete"}),"s, allowing you to take working code and edit the feature flag\nwithout disturbing existing users. In an ",(0,t.jsx)(n.code,{children:"if"})," statement, neither branch would\nexecute."]}),"\n",(0,t.jsx)(n.h2,{id:"planned-language-features",children:"Planned language features"}),"\n",(0,t.jsx)(n.h3,{id:"sets",children:"Sets"}),"\n",(0,t.jsx)(n.p,{children:"We intend for Darklang to support Sets: unordered collections of a single type."}),"\n",(0,t.jsx)(n.h3,{id:"unit",children:"Unit"}),"\n",(0,t.jsx)(n.p,{children:"We intend to support the unit type, which indicates something that have no type,\nsuch as an imperative function that doesn't return anything."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"x = ()\n"})}),"\n",(0,t.jsx)(n.h3,{id:"imperative-programming-statements-and-refs",children:"Imperative programming (Statements and refs)"}),"\n",(0,t.jsx)(n.p,{children:"It is intended that you write the program as you think it, not to shoehorn your\nprogram into a functional style. As such, Darklang is planning to add a number\nof imperative concepts to allow you to easily write imperative algorithms,\nincluding statements, refs, and mutable data structures."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},19722:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/if_example-7fd9df71f9247946ff93674b1e87c783.png"},19815:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/list_example-721d3f85f7dc382b2d081d0c29f4196e.png"},18276:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/option_example-292ccfa26e65d8f6efa608bcbbc2b296.png"},36580:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/result_example-359f708d3638e84b636b27756288e886.png"},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var t=s(96540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aa21778.b110725d.js b/assets/js/0aa21778.b110725d.js deleted file mode 100644 index afb8dff5b..000000000 --- a/assets/js/0aa21778.b110725d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7953],{58625:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var t=s(85893),a=s(11151);const i={id:"languagedetails",title:"Language Details",sidebar_label:"Language Details"},r=void 0,l={id:"reference/languagedetails",title:"Language Details",description:"This doc describes the Darklang language. Darklang is really a system - a",source:"@site/docs-classic/reference/languagedetails.md",sourceDirName:"reference",slug:"/reference/languagedetails",permalink:"/reference/languagedetails",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/languagedetails.md",tags:[],version:"current",frontMatter:{id:"languagedetails",title:"Language Details",sidebar_label:"Language Details"},sidebar:"docs",previous:{title:"Sample Canvases",permalink:"/reference/sample-canvases"},next:{title:"Keyboard Mapping",permalink:"/reference/keyboard-mapping"}},o={},d=[{value:"Type system",id:"type-system",level:3},{value:"Built-in types",id:"built-in-types",level:2},{value:"Integers",id:"integers",level:3},{value:"Floats",id:"floats",level:3},{value:"Booleans",id:"booleans",level:3},{value:"Strings",id:"strings",level:3},{value:"Characters",id:"characters",level:3},{value:"Lists/Arrays",id:"listsarrays",level:3},{value:"Tuples (In-Progress)",id:"tuples-in-progress",level:3},{value:"Binary",id:"binary",level:3},{value:"Options",id:"options",level:3},{value:"Results",id:"results",level:3},{value:"Dicts",id:"dicts",level:3},{value:"UUID",id:"uuid",level:3},{value:"Null",id:"null",level:3},{value:"User defined types",id:"user-defined-types",level:2},{value:"Records",id:"records",level:3},{value:"Enums",id:"enums",level:3},{value:"Types unique to Darklang",id:"types-unique-to-darklang",level:2},{value:"Incompletes",id:"incompletes",level:3},{value:"Error rail",id:"error-rail",level:3},{value:"Sensitive Types",id:"sensitive-types",level:3},{value:"Expressions",id:"expressions",level:2},{value:"Let",id:"let",level:3},{value:"Variable Scope",id:"variable-scope",level:4},{value:"If",id:"if",level:3},{value:"Match",id:"match",level:3},{value:"Functions",id:"functions",level:3},{value:"Lambda",id:"lambda",level:3},{value:"Pipelining",id:"pipelining",level:3},{value:"Feature Flags",id:"feature-flags",level:3},{value:"Planned language features",id:"planned-language-features",level:2},{value:"Sets",id:"sets",level:3},{value:"Unit",id:"unit",level:3},{value:"Imperative programming (Statements and refs)",id:"imperative-programming-statements-and-refs",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This doc describes the Darklang language. Darklang is really a system - a\ncombination of the language, editor, framework and infrastructure. In this doc,\nwe'll focus on discussing the language itself, ignoring where possible the\neditor and infrastructure."}),"\n",(0,t.jsxs)(n.p,{children:["This discusses both the language and the ",(0,t.jsx)(n.strong,{children:"intended"})," language. We have taken\nmany shortcuts to be able to ship Darklang, and so many parts of the language\nare not currently at their end state. Here we discuss both what the language is,\nand what we intend it to be."]}),"\n",(0,t.jsx)(n.p,{children:"Darklang is a statically-typed functional/imperative hybrid, based loosely on\nML. It is a high-level language, with immutable values, garbage collection, and\nsupport for generics/polymorphic types."}),"\n",(0,t.jsx)(n.p,{children:"Darklang is somewhat similar to OCaml or Elm. It has many similarities to Rust\nand Haskell, and is also influenced by Clojure, Ruby, Python, CoffeeScript, as\nwell as our experience with (alphabetically) Bash, C, Clojure, CoffeeScript,\nC++, Elm, Javascript, Java, Haskell, OCaml, Perl, PHP, Python, ReasonML,\nRuby/Rails, React, and Rust."}),"\n",(0,t.jsx)(n.h3,{id:"type-system",children:"Type system"}),"\n",(0,t.jsx)(n.p,{children:"Dark\u2019s type system is most similar to Elm, Haskell, ReasonML, OCaml or Rust:\nbased on records, enums, list, and built-in generics/polymorphism. All values in\nDarklang are immutable, except refs."}),"\n",(0,t.jsxs)(n.p,{children:["Darklang has some standard basic types: ",(0,t.jsx)(n.code,{children:"int"}),", ",(0,t.jsx)(n.code,{children:"string"}),", ",(0,t.jsx)(n.code,{children:"boolean"}),", ",(0,t.jsx)(n.code,{children:"float"}),",\n",(0,t.jsx)(n.code,{children:"list"}),", and ",(0,t.jsx)(n.code,{children:"dicts"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["We support typical functional types: ",(0,t.jsx)(n.code,{children:"Option"})," and ",(0,t.jsx)(n.code,{children:"Result"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Currently, Darklang has a ",(0,t.jsx)(n.code,{children:"null"})," type to support JSON values directly. In the\nfuture, we intend to deprecate ",(0,t.jsx)(n.code,{children:"null"})," and replace it with ",(0,t.jsx)(n.code,{children:"Options"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"built-in-types",children:"Built-in types"}),"\n",(0,t.jsx)(n.h3,{id:"integers",children:"Integers"}),"\n",(0,t.jsx)(n.p,{children:"Integers are signed 63-bit integer."}),"\n",(0,t.jsx)(n.p,{children:"In the future, Darklang will use infinite-precision integers. We also intend to\nadd unsigned 8-bit integers and bit-manipulation functions."}),"\n",(0,t.jsx)(n.h3,{id:"floats",children:"Floats"}),"\n",(0,t.jsx)(n.p,{children:"Floats are double-precision 64-bit floating-point values (IEEE 754)."}),"\n",(0,t.jsxs)(n.p,{children:["We intend for numeric operations to return Results, to handle situations which\nare undefined on the datatype. For example, integer division would return\n",(0,t.jsx)(n.code,{children:"Result Error Int"}),". Similarly, floating point values would never be ",(0,t.jsx)(n.code,{children:"NaN"}),", and\ninstead would return ",(0,t.jsx)(n.code,{children:"Result Error Float"}),". See\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Handling in Darklang"}),"\nfor more."]}),"\n",(0,t.jsx)(n.h3,{id:"booleans",children:"Booleans"}),"\n",(0,t.jsx)(n.p,{children:"Booleans are true or false."}),"\n",(0,t.jsx)(n.h3,{id:"strings",children:"Strings"}),"\n",(0,t.jsx)(n.p,{children:"Strings are unicode, and character are unicode \u201ccharacters\u201d (if it appears as\none character on the screen, that\u2019s a \u201ccharacter\u201d in Darklang)."}),"\n",(0,t.jsx)(n.p,{children:"Specifically, string are immutable UTF-8 encoded sequences of Unicode code\npoints. Chars are \u201cExtended Grapheme Clusters\u201d. (A codepoint is some bytes that\nimplement unicode characters, a grapheme is some codepoints forming a unicode\nentity, such as an emoji; an EGC is some graphemes, used to handle things like\nemojis which combine to form a single emoji)."}),"\n",(0,t.jsx)(n.p,{children:"Darklang doesn't currently support string interpolation, but we plan to in the\nfuture."}),"\n",(0,t.jsx)(n.h3,{id:"characters",children:"Characters"}),"\n",(0,t.jsxs)(n.p,{children:["A character in Darklang represents a character that you see on your screen, such\nas ",(0,t.jsx)(n.code,{children:"'a'"}),", ",(0,t.jsx)(n.code,{children:"'1'"}),", ",(0,t.jsx)(n.code,{children:"'\u017b'"}),", ",(0,t.jsx)(n.code,{children:"'\ud83c\uddf5\ud83c\uddf7'"}),", ",(0,t.jsx)(n.code,{children:"'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66'"}),". This is in contrast to most languages,\nwhere a character represents one byte, or perhaps a Unicode codepoint. We chose\nthis"]}),"\n",(0,t.jsxs)(n.p,{children:["The technical name for a Darklang character is an ",(0,t.jsx)(n.em,{children:"Extended Grapheme Cluster"}),",\nand can best be thought of as supporting the entire character you see in front\nof you - in the case of emoji, this includes such things as combining characters\nand skin tones. See [Strings](### Strings) above for additional context."]}),"\n",(0,t.jsxs)(n.p,{children:["While the Darklang language has support for Characters, the Editor experience\nwith Characters is quite limited. For example, we do not yet support Character\nliterals using single quotes, such as ",(0,t.jsx)(n.code,{children:"'a'"}),". Until proper support exists, you\ncan define a Char in Darklang rather indirectly:\n",(0,t.jsx)(n.code,{children:'let charExample = "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" |> String::toList |> List.head'}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"listsarrays",children:"Lists/Arrays"}),"\n",(0,t.jsx)(n.p,{children:"Lists and Arrays use the same datatype, called Lists. The Darklang compiler will\nin the future optimize their implementation to support good algorithmic\ncomplexity and performance for whatever you use them for."}),"\n",(0,t.jsx)(n.p,{children:"Lists should be used for all \u201cI want a sequence of things\u201d situations, including\niterating across them, random access, push/pop, etc."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"let x = [8]\nlet y = List::append x [6]\ny\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"[8, 6]\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"List Example",src:s(833).Z+"",width:"994",height:"200"})}),"\n",(0,t.jsx)(n.h3,{id:"tuples-in-progress",children:"Tuples (In-Progress)"}),"\n",(0,t.jsx)(n.p,{children:"Darklang supports tuples: lists of defined length supporting heterogeneous\ntypes."}),"\n",(0,t.jsxs)(n.p,{children:["Tuple support is currently a\n",(0,t.jsx)(n.a,{href:"https://github.com/darklang/dark/issues/4265",children:"work-in-progress"}),", and only\navailable in the editor after opting in via the Settings dialog. Feedback is\nwelcome!"]}),"\n",(0,t.jsxs)(n.p,{children:["See Release 5 in the ",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/changelog",children:"changelog"}),"\nfor a demo of opting in."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let x = (1, "string", { name: "Sam" })\n'})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Tuples can be created in the editor by entering ",(0,t.jsx)(n.code,{children:"("})," in a blank."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Inserting additional separators (",(0,t.jsx)(n.code,{children:","}),") extends the size of the tuple; removing\nseparators/elements reduces the size, generally removing the element to the\nleft of the separator"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Darklang's Standard Library includes ",(0,t.jsx)(n.code,{children:"Tuple2"})," and ",(0,t.jsx)(n.code,{children:"Tuple3"})," modules, which\nprovide functions used to work with tuples of size 2 and 3."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Pattern matching with ",(0,t.jsx)(n.code,{children:"match"})," supports tuples:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let headers = Dict::toList request.headers\nlet contentTypePlain =\n List::findFirst headers \\header ->\n let (key, value) = Tuple2::mapFirst (\\key -> String::toLower key) header\n match (key, value)\n ("content-type", "application/json") -> Just "json"\n ("content-type", "text/html") -> Just "html"\n _ -> Nothing\n'})}),"\n",(0,t.jsx)(n.p,{children:"Tuple match patterns can be created and extended the same way as tuple\nexpressions."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The following constructs are planned but not yet implemented:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Tuples can be deconstructed into their parts via a ",(0,t.jsx)(n.code,{children:"let"})," expression:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:"let philadelphia = (39.9526, 75.1652)\nlet (lat, long) = philadelphia\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"User functions may accept and return Tuples (TODO: I'm not sure how to phrase\nthis)"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"binary",children:"Binary"}),"\n",(0,t.jsxs)(n.p,{children:["Non-unicode sequences of bytes are supported as the ",(0,t.jsx)(n.code,{children:"Binary"})," type."]}),"\n",(0,t.jsx)(n.h3,{id:"options",children:"Options"}),"\n",(0,t.jsx)(n.p,{children:"Instead of allowing all values to potentially be null, as in most imperative\nlanguages, Darklang uses an Option type:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"Option a = Just a | Nothing\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Option Example",src:s(76947).Z+"",width:"1374",height:"402"})}),"\n",(0,t.jsx)(n.p,{children:"This is intended to convert effortlessly to null in JSON, but we don't quite\nhave enough of the type system to remove null, so they both exist right now."}),"\n",(0,t.jsxs)(n.p,{children:["Functions which return ",(0,t.jsx)(n.code,{children:"Option"})," trigger the\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Rail"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"results",children:"Results"}),"\n",(0,t.jsx)(n.p,{children:"Any functions which can have an error should use Results. We use results for Int\ndivision, Float operations, HTTP operations, etc."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"Result a = Ok a | Err Error\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Darklang has no exceptions - all errors go through Results. See\n",(0,t.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"error handling"})," for more\ndetails."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Result Example",src:s(28143).Z+"",width:"1376",height:"414"})}),"\n",(0,t.jsx)(n.h3,{id:"dicts",children:"Dicts"}),"\n",(0,t.jsx)(n.p,{children:"Dicts are maps from a certain key type to a certain value type. The key must\ncurrently be a string. The value can be any type but all elements of the Dict\nare the same type (not currently enforced)."}),"\n",(0,t.jsx)(n.p,{children:"Dicts are different than records: dicts can have arbitrary keys."}),"\n",(0,t.jsx)(n.h3,{id:"uuid",children:"UUID"}),"\n",(0,t.jsx)(n.p,{children:"Darklang supports UUIDs directly."}),"\n",(0,t.jsx)(n.h3,{id:"null",children:"Null"}),"\n",(0,t.jsxs)(n.p,{children:["As a temporary hack, Darklang also supports ",(0,t.jsx)(n.code,{children:"null"}),". This allows us handle JSON\nwhile we build out enough type-system support to allow them to be replaced by\n",(0,t.jsx)(n.code,{children:"Option"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"Null"})," is mostly useful for comparing against incoming JSON and results of\n",(0,t.jsx)(n.code,{children:"HttpClient"})," calls. When returning JSON or making ",(0,t.jsx)(n.code,{children:"HttpClient"})," calls, you can\nuse ",(0,t.jsx)(n.code,{children:"Option"}),"s instead and they will be converted properly to ",(0,t.jsx)(n.code,{children:"null"})," in the JSON\noutput."]}),"\n",(0,t.jsx)(n.h2,{id:"user-defined-types",children:"User defined types"}),"\n",(0,t.jsx)(n.p,{children:"Darklang currently has limited support for user-defined types. Currently, we\nsupport inline definition of records, but do not support defining record types\nexplicitly."}),"\n",(0,t.jsx)(n.p,{children:"Record types are actually implemented under the hood, and we intend to use them\nto support typed Datastores, API contracts, and static types."}),"\n",(0,t.jsx)(n.p,{children:"Darklang does not currently support user-defined enums."}),"\n",(0,t.jsx)(n.p,{children:"User-defined types will be either records or enums, or combinations of other\ntype expressions."}),"\n",(0,t.jsx)(n.p,{children:"Types in Darklang are out-of-line, meaning that they are not defined \u201con the\ncanvas\u201d, in a similar way to functions."}),"\n",(0,t.jsx)(n.p,{children:"All types in Darklang will be versioned."}),"\n",(0,t.jsx)(n.p,{children:"In the future, we intend to support typeclasses or traits to allow ad-hoc\npolymorphism."}),"\n",(0,t.jsx)(n.h3,{id:"records",children:"Records"}),"\n",(0,t.jsx)(n.p,{children:"Records are most akin to Classes in an imperative language."}),"\n",(0,t.jsx)(n.p,{children:"Records are a set of keys and values. Each key name and type are defined, and\nthe types do not have to be the same."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'let x = { name: "Robin"\n age: 32\n gender: "Other"\n }\n'})}),"\n",(0,t.jsx)(n.p,{children:"Records can not be accessed dynamically; they are not Maps/Hashtables/Dicts."}),"\n",(0,t.jsx)(n.p,{children:"Records are structurally typed, and are equivalent to records of the same shape\nbut a different name."}),"\n",(0,t.jsx)(n.p,{children:"Note that at the moment, Dicts and Records share the same implementation and can\nbe accessed and modified in the same way. We intend to break these apart in the\nfuture."}),"\n",(0,t.jsx)(n.h3,{id:"enums",children:"Enums"}),"\n",(0,t.jsx)(n.p,{children:"Enums are a set of \u201cconstructors\u201d, each of which has a set of typed arguments."}),"\n",(0,t.jsxs)(n.p,{children:["Currently, Darklang only supports ",(0,t.jsx)(n.code,{children:"Option"})," and ",(0,t.jsx)(n.code,{children:"Result"})," built-in enums. In the\nfuture, we will support user-defined enums."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"type Person = Human {age: Int, name: String, itin: String }\n | Corporation {age: Int, name: String, ein: String }\n | Puppers Int String\n"})}),"\n",(0,t.jsx)(n.p,{children:"Enums can be made by building on existing types, especially records and other\nenums."}),"\n",(0,t.jsx)(n.p,{children:"Enums are nominally typed. (Two enums with the same field names and types are\nnot equivalent)."}),"\n",(0,t.jsx)(n.h2,{id:"types-unique-to-darklang",children:"Types unique to Darklang"}),"\n",(0,t.jsx)(n.h3,{id:"incompletes",children:"Incompletes"}),"\n",(0,t.jsx)(n.p,{children:"Programs in Darklang start as a single empty expression. As they get built up in\nour structured editor, they can never become syntactically invalid. However, a\nprogram may be incomplete if any its expressions are empty."}),"\n",(0,t.jsx)(n.p,{children:"An empty expression is incomplete. A developer may write programs where some\nparts are incomplete as they build out the code. As such, incomplete values\nappear dynamically when the code is executed. Structures containing incompletes\nare themselves incomplete. For example functions with incomplete arguments do\nnot execute, and return incomplete; and records with an incomplete field are\nalso incomplete."}),"\n",(0,t.jsx)(n.p,{children:"Incompletes are never returned to end users, and cannot be stored in a\ndatastore. Returning an incomplete via a HTTP handler causes a 500 error."}),"\n",(0,t.jsx)(n.h3,{id:"error-rail",children:"Error rail"}),"\n",(0,t.jsxs)(n.p,{children:["You might occasionally see a value marked ",(0,t.jsx)(n.code,{children:""}),", this is used to\nindicate that a value is on the Error Rail. See\n",(0,t.jsx)(n.a,{href:"https://blog.darklang.com/real-problems-with-functional-languages/",children:"Railway Oriented Programming"}),"\nfor more details."]}),"\n",(0,t.jsx)(n.h3,{id:"sensitive-types",children:"Sensitive Types"}),"\n",(0,t.jsx)(n.p,{children:"Some values are sensitive, for example, passwords or credit card numbers."}),"\n",(0,t.jsxs)(n.p,{children:["Currently Darklang supports the ",(0,t.jsx)(n.code,{children:"Password"})," type, which is never saved directly\nor sent to the editor."]}),"\n",(0,t.jsx)(n.p,{children:"In the future, Darklang will allow you to specify types of sensitive values,\npreventing them from being stored in logs, and allowing a team to limit who has\naccess to these values in the Darklang editor."}),"\n",(0,t.jsx)(n.h2,{id:"expressions",children:"Expressions"}),"\n",(0,t.jsx)(n.p,{children:"All Darklang language constructs are expressions. That means that they evaluate\nto a value, rather than being used to set state."}),"\n",(0,t.jsx)(n.h3,{id:"let",children:"Let"}),"\n",(0,t.jsx)(n.p,{children:"Lets creates a name with an immutable value, and a scope in which that is\ndefined."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'let name = "Stella"\nname\n'})}),"\n",(0,t.jsx)(n.p,{children:"We often refer to these names as variables, for simplicity. However, they never\nvary: once they are defined, they never have any other value."}),"\n",(0,t.jsx)(n.h4,{id:"variable-scope",children:"Variable Scope"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"if age > 18\nthen\n let height = 170\n height + 12\nelse\n let weight = 105\n weight / 2\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the scope of ",(0,t.jsx)(n.code,{children:"height"})," and ",(0,t.jsx)(n.code,{children:"weight"})," only extends to within\nthe ",(0,t.jsx)(n.code,{children:"then"})," block and ",(0,t.jsx)(n.code,{children:"else"})," block respectively. You cannot use either variable\nbelow the ",(0,t.jsx)(n.code,{children:"if"})," expression."]}),"\n",(0,t.jsx)(n.h3,{id:"if",children:"If"}),"\n",(0,t.jsxs)(n.p,{children:["Darklang supports if/else statement. The argument to an ",(0,t.jsx)(n.code,{children:"if"})," is a boolean. We\ncurrently support ",(0,t.jsx)(n.code,{children:"truthy"})," types but intend to remove that ability."]}),"\n",(0,t.jsxs)(n.p,{children:["We support ",(0,t.jsx)(n.code,{children:"&&"})," and ",(0,t.jsx)(n.code,{children:"||"}),", which short-circuit (only evaluate the second\nexpression if needed). However, we used to support versions of ",(0,t.jsx)(n.code,{children:"&&"})," and ",(0,t.jsx)(n.code,{children:"||"}),"\nthat did not short-circuit; those are deprecated (the editor will show\ndocumentation about how to move to the new versions)."]}),"\n",(0,t.jsxs)(n.p,{children:["An ",(0,t.jsx)(n.code,{children:"if"})," is not currently allowed without a corresponding ",(0,t.jsx)(n.code,{children:"else"})," - we will relax\nthis after we introduce statements."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"If Example",src:s(43174).Z+"",width:"1384",height:"394"})}),"\n",(0,t.jsx)(n.h3,{id:"match",children:"Match"}),"\n",(0,t.jsxs)(n.p,{children:["Darklang supports pattern matching, in particular, matching on ",(0,t.jsx)(n.code,{children:"Enum"}),"s."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-fsharp",children:'let introduction =\n match name with\n | Nothing -> "Hi!"\n | Just name -> "Dear " ++ name\n'})}),"\n",(0,t.jsxs)(n.p,{children:["We expect to allow guards in the future. We also hope to add an ",(0,t.jsx)(n.code,{children:"if-let"}),"\nconstruct to support ",(0,t.jsx)(n.code,{children:"if"})," statements that destructure from Enums."]}),"\n",(0,t.jsx)(n.h3,{id:"functions",children:"Functions"}),"\n",(0,t.jsx)(n.p,{children:"Functions must have type declarations for inputs. We intend to support types on\nreturn values soon."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"fetch url name =\n { url: url\n , name: name\n }\n"})}),"\n",(0,t.jsx)(n.p,{children:"Functions in Darklang are simple, and do not currently support functional\nlanguage concepts, such as partial application, functions as first-class values,\nand defining functions in using points-free style."}),"\n",(0,t.jsx)(n.p,{children:"Functions do not live in the \u201cCanvas\u201d, but rather are a little bit ethereal."}),"\n",(0,t.jsxs)(n.p,{children:["Built-in functions are all versioned: we frequently deprecate old functions and\nadd updates. When we deprecate old versions, your code does ",(0,t.jsx)(n.em,{children:"not"})," change, and\nyou keep using the old ones. We intend to support automated refactoring and\nupdating in the future."]}),"\n",(0,t.jsx)(n.p,{children:"In the future, we intend to support partial application/currying, and\ndefault/optional parameters."}),"\n",(0,t.jsx)(n.h3,{id:"lambda",children:"Lambda"}),"\n",(0,t.jsxs)(n.p,{children:["Lambdas are anonymous functions. They are used to pass to functions which take\n",(0,t.jsx)(n.code,{children:"Block"}),"s, typically used for iteration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"List::map [5, 10, 11] \\var -> var + 2\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"[7, 12, 13]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the future, we intend to support a syntax for shorthands for creating lambdas\nto access fields: ",(0,t.jsx)(n.code,{children:".fieldname"}),". This can be included in a pipe or used as a\nfirst class function."]}),"\n",(0,t.jsx)(n.p,{children:"We also intend to support passing functions where blocks are expected."}),"\n",(0,t.jsxs)(n.p,{children:["There is a syntax for shorthands for creating lambda\u2019s to call constructors:\n",(0,t.jsx)(n.code,{children:"ConstructorName"}),". This can be included in a pipe or used as a first class\nfunction."]}),"\n",(0,t.jsx)(n.h3,{id:"pipelining",children:"Pipelining"}),"\n",(0,t.jsx)(n.p,{children:"Darklang programs are intended to be written, as much as possible, as pipelines\nof data:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:'user\n|> getFriends\n|> List.map (\\f -> (f, getFriends f))\n|> List.filter (\\f -> f.name == "Kevin Bacon")\n|> (=) []\n'})}),"\n",(0,t.jsx)(n.h3,{id:"feature-flags",children:"Feature Flags"}),"\n",(0,t.jsxs)(n.p,{children:["Feature flags are similar to ",(0,t.jsx)(n.code,{children:"if"}),"s:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"flag myCondition\nthen 5\nelse 6\n"})}),"\n",(0,t.jsxs)(n.p,{children:["However, flags differ slightly from ifs in that any condition that is not ",(0,t.jsx)(n.code,{children:"true"}),"\nwill cause the ",(0,t.jsx)(n.code,{children:"then"})," block to activate. This is especially important around\n",(0,t.jsx)(n.code,{children:"incomplete"}),"s, allowing you to take working code and edit the feature flag\nwithout disturbing existing users. In an ",(0,t.jsx)(n.code,{children:"if"})," statement, neither branch would\nexecute."]}),"\n",(0,t.jsx)(n.h2,{id:"planned-language-features",children:"Planned language features"}),"\n",(0,t.jsx)(n.h3,{id:"sets",children:"Sets"}),"\n",(0,t.jsx)(n.p,{children:"We intend for Darklang to support Sets: unordered collections of a single type."}),"\n",(0,t.jsx)(n.h3,{id:"unit",children:"Unit"}),"\n",(0,t.jsx)(n.p,{children:"We intend to support the unit type, which indicates something that have no type,\nsuch as an imperative function that doesn't return anything."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-elm",children:"x = ()\n"})}),"\n",(0,t.jsx)(n.h3,{id:"imperative-programming-statements-and-refs",children:"Imperative programming (Statements and refs)"}),"\n",(0,t.jsx)(n.p,{children:"It is intended that you write the program as you think it, not to shoehorn your\nprogram into a functional style. As such, Darklang is planning to add a number\nof imperative concepts to allow you to easily write imperative algorithms,\nincluding statements, refs, and mutable data structures."})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},43174:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/if_example-7fd9df71f9247946ff93674b1e87c783.png"},833:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/list_example-721d3f85f7dc382b2d081d0c29f4196e.png"},76947:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/option_example-292ccfa26e65d8f6efa608bcbbc2b296.png"},28143:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/result_example-359f708d3638e84b636b27756288e886.png"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>r});var t=s(67294);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b9525aa.6ff1cbd0.js b/assets/js/0b9525aa.6ff1cbd0.js deleted file mode 100644 index ecb3de3df..000000000 --- a/assets/js/0b9525aa.6ff1cbd0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7932],{26289:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>h,toc:()=>o});var s=t(85893),i=t(11151);const a={},c="Python Cheat Sheet",h={id:"reference/cheatsheets/python-cheatsheet",title:"Python Cheat Sheet",description:"This guide will help you learn Darklang if you're familiar with Python.",source:"@site/docs-classic/reference/cheatsheets/python-cheatsheet.md",sourceDirName:"reference/cheatsheets",slug:"/reference/cheatsheets/python-cheatsheet",permalink:"/reference/cheatsheets/python-cheatsheet",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/cheatsheets/python-cheatsheet.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Reference",permalink:"/category/reference"},next:{title:"Javascript cheat sheet",permalink:"/reference/cheatsheets/javascript-cheatsheet"}},r={},o=[{value:"Comments",id:"comments",level:2},{value:"Strings",id:"strings",level:2},{value:"Functions",id:"functions",level:2},{value:"Standard Library/Built-in Functions",id:"standard-librarybuilt-in-functions",level:2},{value:"If/Elif/Else statements",id:"ifelifelse-statements",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"python-cheat-sheet",children:"Python Cheat Sheet"})}),"\n",(0,s.jsx)(n.p,{children:"This guide will help you learn Darklang if you're familiar with Python."}),"\n",(0,s.jsxs)(n.p,{children:["Have a tip to add to the guide?\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/docs/pulls",children:"Submit a PR"}),"!"]}),"\n",(0,s.jsx)(n.h2,{id:"comments",children:"Comments"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you use a ",(0,s.jsx)(n.code,{children:"#"})," to start a comment:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# This is a comment\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In Darklang, you use a ",(0,s.jsx)(n.code,{children:"let _ ="})," to start a comment, and you write the comment as a\nString:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/comment.png",src:t(39718).Z+"",width:"742",height:"152"})}),"\n",(0,s.jsx)(n.h2,{id:"strings",children:"Strings"}),"\n",(0,s.jsx)(n.p,{children:"In Python, you can write a String in multiple ways:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"\"This is a string\"\n'This is also a string'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In Darklang, you always use double quotes:\n",(0,s.jsx)(n.img,{alt:"from-python/string.png",src:t(5198).Z+"",width:"742",height:"124"})]}),"\n",(0,s.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you use the ",(0,s.jsx)(n.code,{children:"def"})," keyword to define a function:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def say_hello():\n print('Hello World')\n"})}),"\n",(0,s.jsx)(n.p,{children:"and you call a function with the function name, followed by parentheses:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"say_hello()\n"})}),"\n",(0,s.jsx)(n.p,{children:"In Darklang, you create a function from the sidebar:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/functionside.png",src:t(28322).Z+"",width:"624",height:"250"})}),"\n",(0,s.jsx)(n.p,{children:"This will open a new function in the function space, where you can define the\nname of the function and its contents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/function.png",src:t(64475).Z+"",width:"1046",height:"342"})}),"\n",(0,s.jsx)(n.h2,{id:"standard-librarybuilt-in-functions",children:"Standard Library/Built-in Functions"}),"\n",(0,s.jsx)(n.p,{children:"Python defines a set of built in functions that are called like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# This returns 2 to the power of 2.\nmath.power(2,2)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Darklang has a set of built in functions as well, which can be accessed via the\nautocomplete:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/power.gif",src:t(70980).Z+"",width:"930",height:"548"})}),"\n",(0,s.jsx)(n.h2,{id:"ifelifelse-statements",children:"If/Elif/Else statements"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you would write an ",(0,s.jsx)(n.code,{children:"if"})," statement like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'a = 5\nb = 10\n\nif p > a:\n print("b is greater than a")\nelif a == b:\n print("a and b are equal")\nelse\n print("a is greater than b")\n'})}),"\n",(0,s.jsx)(n.p,{children:"In Darklang, the same statement would look this this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/ifs.png",src:t(41298).Z+"",width:"798",height:"482"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that we highlight the path your code takes - so if we were to change the\nvalues, a different piece of the ",(0,s.jsx)(n.code,{children:"if"})," statement would be highlighted:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/ifs2.png",src:t(50563).Z+"",width:"796",height:"508"})})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},39718:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/comment-31d6d49158d5fb9df9f157bf7aac703b.png"},64475:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/function-2a3cb08413c103bd95ff89e7cf1c1ed9.png"},28322:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/functionside-ae5554dbc3021497c1b1710b65443cc1.png"},41298:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/ifs-d21faa266d0f403b717b2278706494b6.png"},50563:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/ifs2-4559f37c703f4406dea70e90aab24161.png"},70980:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/power-a4ade5fff8ecfd57c39b737dc301fa5f.gif"},5198:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/string-170049731f56bfe52d41ac15ccc0fe50.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>h,a:()=>c});var s=t(67294);const i={},a=s.createContext(i);function c(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function h(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b9525aa.add59ac1.js b/assets/js/0b9525aa.add59ac1.js new file mode 100644 index 000000000..91bf4a584 --- /dev/null +++ b/assets/js/0b9525aa.add59ac1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9882],{19013:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>h,toc:()=>o});var s=t(74848),i=t(28453);const a={},c="Python Cheat Sheet",h={id:"reference/cheatsheets/python-cheatsheet",title:"Python Cheat Sheet",description:"This guide will help you learn Darklang if you're familiar with Python.",source:"@site/docs-classic/reference/cheatsheets/python-cheatsheet.md",sourceDirName:"reference/cheatsheets",slug:"/reference/cheatsheets/python-cheatsheet",permalink:"/reference/cheatsheets/python-cheatsheet",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/cheatsheets/python-cheatsheet.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Reference",permalink:"/category/reference"},next:{title:"Javascript cheat sheet",permalink:"/reference/cheatsheets/javascript-cheatsheet"}},r={},o=[{value:"Comments",id:"comments",level:2},{value:"Strings",id:"strings",level:2},{value:"Functions",id:"functions",level:2},{value:"Standard Library/Built-in Functions",id:"standard-librarybuilt-in-functions",level:2},{value:"If/Elif/Else statements",id:"ifelifelse-statements",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"python-cheat-sheet",children:"Python Cheat Sheet"})}),"\n",(0,s.jsx)(n.p,{children:"This guide will help you learn Darklang if you're familiar with Python."}),"\n",(0,s.jsxs)(n.p,{children:["Have a tip to add to the guide?\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/docs/pulls",children:"Submit a PR"}),"!"]}),"\n",(0,s.jsx)(n.h2,{id:"comments",children:"Comments"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you use a ",(0,s.jsx)(n.code,{children:"#"})," to start a comment:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# This is a comment\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In Darklang, you use a ",(0,s.jsx)(n.code,{children:"let _ ="})," to start a comment, and you write the comment as a\nString:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/comment.png",src:t(47280).A+"",width:"742",height:"152"})}),"\n",(0,s.jsx)(n.h2,{id:"strings",children:"Strings"}),"\n",(0,s.jsx)(n.p,{children:"In Python, you can write a String in multiple ways:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"\"This is a string\"\n'This is also a string'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In Darklang, you always use double quotes:\n",(0,s.jsx)(n.img,{alt:"from-python/string.png",src:t(54148).A+"",width:"742",height:"124"})]}),"\n",(0,s.jsx)(n.h2,{id:"functions",children:"Functions"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you use the ",(0,s.jsx)(n.code,{children:"def"})," keyword to define a function:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def say_hello():\n print('Hello World')\n"})}),"\n",(0,s.jsx)(n.p,{children:"and you call a function with the function name, followed by parentheses:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"say_hello()\n"})}),"\n",(0,s.jsx)(n.p,{children:"In Darklang, you create a function from the sidebar:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/functionside.png",src:t(80918).A+"",width:"624",height:"250"})}),"\n",(0,s.jsx)(n.p,{children:"This will open a new function in the function space, where you can define the\nname of the function and its contents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/function.png",src:t(37415).A+"",width:"1046",height:"342"})}),"\n",(0,s.jsx)(n.h2,{id:"standard-librarybuilt-in-functions",children:"Standard Library/Built-in Functions"}),"\n",(0,s.jsx)(n.p,{children:"Python defines a set of built in functions that are called like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# This returns 2 to the power of 2.\nmath.power(2,2)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Darklang has a set of built in functions as well, which can be accessed via the\nautocomplete:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/power.gif",src:t(82131).A+"",width:"930",height:"548"})}),"\n",(0,s.jsx)(n.h2,{id:"ifelifelse-statements",children:"If/Elif/Else statements"}),"\n",(0,s.jsxs)(n.p,{children:["In Python, you would write an ",(0,s.jsx)(n.code,{children:"if"})," statement like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'a = 5\nb = 10\n\nif p > a:\n print("b is greater than a")\nelif a == b:\n print("a and b are equal")\nelse\n print("a is greater than b")\n'})}),"\n",(0,s.jsx)(n.p,{children:"In Darklang, the same statement would look this this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/ifs.png",src:t(47371).A+"",width:"798",height:"482"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that we highlight the path your code takes - so if we were to change the\nvalues, a different piece of the ",(0,s.jsx)(n.code,{children:"if"})," statement would be highlighted:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"from-python/ifs2.png",src:t(18129).A+"",width:"796",height:"508"})})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},47280:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/comment-31d6d49158d5fb9df9f157bf7aac703b.png"},37415:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/function-2a3cb08413c103bd95ff89e7cf1c1ed9.png"},80918:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/functionside-ae5554dbc3021497c1b1710b65443cc1.png"},47371:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/ifs-d21faa266d0f403b717b2278706494b6.png"},18129:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/ifs2-4559f37c703f4406dea70e90aab24161.png"},82131:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/power-a4ade5fff8ecfd57c39b737dc301fa5f.gif"},54148:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/string-170049731f56bfe52d41ac15ccc0fe50.png"},28453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>h});var s=t(96540);const i={},a=s.createContext(i);function c(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function h(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/10df8161.341483cd.js b/assets/js/10df8161.341483cd.js deleted file mode 100644 index 7868fe0e7..000000000 --- a/assets/js/10df8161.341483cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9534],{57428:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"How-to Guides","slug":"/category/how-to","permalink":"/category/how-to","sidebar":"docs","navigation":{"previous":{"title":"Freshdesk: Fetch and update tickets","permalink":"/walk-throughs/freshdesk"},"next":{"title":"How to host Static Assets","permalink":"/how-to/static-assets"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/10df8161.f04495fa.js b/assets/js/10df8161.f04495fa.js new file mode 100644 index 000000000..0d75e96c5 --- /dev/null +++ b/assets/js/10df8161.f04495fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[944],{28420:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"How-to Guides","slug":"/category/how-to","permalink":"/category/how-to","sidebar":"docs","navigation":{"previous":{"title":"Freshdesk: Fetch and update tickets","permalink":"/walk-throughs/freshdesk"},"next":{"title":"How to host Static Assets","permalink":"/how-to/static-assets"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/13b89620.ca7a8372.js b/assets/js/13b89620.c5426740.js similarity index 95% rename from assets/js/13b89620.ca7a8372.js rename to assets/js/13b89620.c5426740.js index 36f6336e7..4294774ea 100644 --- a/assets/js/13b89620.ca7a8372.js +++ b/assets/js/13b89620.c5426740.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7709],{90393:(a,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>o});var s=n(85893),l=n(11151);const r={id:"sample-canvases",title:"Sample Canvases",sidebar_label:"Sample Canvases"},i=void 0,t={id:"reference/sample-canvases",title:"Sample Canvases",description:"We've created a set of sample canvases as examples of how build things in",source:"@site/docs-classic/reference/sample-canvases.md",sourceDirName:"reference",slug:"/reference/sample-canvases",permalink:"/reference/sample-canvases",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/sample-canvases.md",tags:[],version:"current",frontMatter:{id:"sample-canvases",title:"Sample Canvases",sidebar_label:"Sample Canvases"},sidebar:"docs",previous:{title:"Cron",permalink:"/reference/framework/cron"},next:{title:"Language Details",permalink:"/reference/languagedetails"}},c={},o=[{value:"Common Functionality",id:"common-functionality",level:2},{value:"Slack",id:"slack",level:2},{value:"Twilio",id:"twilio",level:2},{value:"Misc. Integrations",id:"misc-integrations",level:2},{value:"Full Sample Projects",id:"full-sample-projects",level:2}];function h(a){const e={a:"a",h2:"h2",hr:"hr",p:"p",...(0,l.a)(),...a.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"We've created a set of sample canvases as examples of how build things in\nDarklang."}),"\n",(0,s.jsx)(e.h2,{id:"common-functionality",children:"Common Functionality"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-conditionals",children:"conditionals"})," - if statements in\nDarklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-cron",children:"cron"})," - a CRON set to run every 1 minute"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-setcrontorunatspecifictime",children:"setcrontorunatspecifictime"})," -\na CRON set to run at a specific time"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-datastoremigration",children:"datastoremigration"})," -\nmigrating from an old datastore to a new datastore"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-formathtml",children:"formathtml"})," - examples of HTML\nformatting within Darklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-match",children:"match"})," - match statements in Darklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-pipeline",children:"pipeline"})," - example of a pipeline"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-randompluck",children:"randompluck"})," - a function that\nreturns a random result"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-returns",children:"returns"})," - a variety of samples of\nreturns"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-square",children:"square"})," - shows how to implement a simple\nfunction to square an input"]}),"\n",(0,s.jsx)(e.h2,{id:"slack",children:"Slack"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slack",children:"slack"})," - common Slack functions"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackmessaging",children:"slackmessaging"})," - posting a\nmessage to a Slack channel"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackmodal",children:"slackmodal"})," - incorporating a model\ninto your Slackbot"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackoauth",children:"slackoauth"})," - integrating with\nSlack's OAuth"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slacksigning",children:"slacksigning"})," - using a Slack\nsigning secret"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackslashcommand",children:"slackslashcommand"})," - using a\nSlack slash command"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-magiceightball",children:"magiceightball"})," - a full magic\neight ball Slackbot"]}),"\n",(0,s.jsxs)(e.p,{children:["For a full Slackbot walk-through, click ",(0,s.jsx)(e.a,{href:"/walk-throughs/slack-app",children:"here"}),"."]}),"\n",(0,s.jsx)(e.h2,{id:"twilio",children:"Twilio"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-signin",children:"signin"})," - an office sign-in that texts\nupon arrival"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-textreminder",children:"textreminder"})," - get texted\nreminders"]}),"\n",(0,s.jsxs)(e.p,{children:["For a full Twilio tutorial, click ",(0,s.jsx)(e.a,{href:"/walk-throughs/twilio-app",children:"here"}),"."]}),"\n",(0,s.jsx)(e.h2,{id:"misc-integrations",children:"Misc. Integrations"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-airtable",children:"airtable"})," - examples of common Airtable\nAPI calls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-discord",children:"discord"})," - an Overwatch team comp\nDiscord bot"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-freshdesk",children:"freshdesk"})," - examples of common\nFreshdesk API calls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-github",children:"github"})," - examples of common GitHub API\ncalls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-mailchimp",children:"mailchimp"})," - sending a Mailchimp\ncampaign"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-oauth",children:"oauth"})," - using Gmail's OAuth flow"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-aws-signing",children:"signing"})," - AWS signing"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-sendgrid",children:"sendgrid"})," - sending emails with the\nSendGrid API"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-twitter-auth",children:"twitter api oauth 1.0"})," - using\nTwitter's OAuth 1.0 flow"]}),"\n",(0,s.jsx)(e.h2,{id:"full-sample-projects",children:"Full Sample Projects"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-emojimood",children:"emojimood"})," - use emojis to express\nyour mood!"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-fizzbuzz",children:"fizzbuzz"})," - solving FizzBuzz in\nDarklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-login",children:"login"})," - a full login flow"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-onboarding",children:"onboarding"})," - example of an easy to\nbuild project for learning Darklang"]}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsxs)(e.p,{children:["If you've built something you'd like featured as a sample canvas, let us know by\nemailing ",(0,s.jsx)(e.a,{href:"mailto:beta@darklang.com",children:"beta@darklang.com"}),"."]})]})}function d(a={}){const{wrapper:e}={...(0,l.a)(),...a.components};return e?(0,s.jsx)(e,{...a,children:(0,s.jsx)(h,{...a})}):h(a)}},11151:(a,e,n)=>{n.d(e,{Z:()=>t,a:()=>i});var s=n(67294);const l={},r=s.createContext(l);function i(a){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof a?a(e):{...e,...a}}),[e,a])}function t(a){let e;return e=a.disableParentContext?"function"==typeof a.components?a.components(l):a.components||l:i(a.components),s.createElement(r.Provider,{value:e},a.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2730],{19647:(a,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>o});var s=n(74848),l=n(28453);const r={id:"sample-canvases",title:"Sample Canvases",sidebar_label:"Sample Canvases"},i=void 0,t={id:"reference/sample-canvases",title:"Sample Canvases",description:"We've created a set of sample canvases as examples of how build things in",source:"@site/docs-classic/reference/sample-canvases.md",sourceDirName:"reference",slug:"/reference/sample-canvases",permalink:"/reference/sample-canvases",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/reference/sample-canvases.md",tags:[],version:"current",frontMatter:{id:"sample-canvases",title:"Sample Canvases",sidebar_label:"Sample Canvases"},sidebar:"docs",previous:{title:"Cron",permalink:"/reference/framework/cron"},next:{title:"Language Details",permalink:"/reference/languagedetails"}},c={},o=[{value:"Common Functionality",id:"common-functionality",level:2},{value:"Slack",id:"slack",level:2},{value:"Twilio",id:"twilio",level:2},{value:"Misc. Integrations",id:"misc-integrations",level:2},{value:"Full Sample Projects",id:"full-sample-projects",level:2}];function h(a){const e={a:"a",h2:"h2",hr:"hr",p:"p",...(0,l.R)(),...a.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"We've created a set of sample canvases as examples of how build things in\nDarklang."}),"\n",(0,s.jsx)(e.h2,{id:"common-functionality",children:"Common Functionality"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-conditionals",children:"conditionals"})," - if statements in\nDarklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-cron",children:"cron"})," - a CRON set to run every 1 minute"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-setcrontorunatspecifictime",children:"setcrontorunatspecifictime"})," -\na CRON set to run at a specific time"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-datastoremigration",children:"datastoremigration"})," -\nmigrating from an old datastore to a new datastore"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-formathtml",children:"formathtml"})," - examples of HTML\nformatting within Darklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-match",children:"match"})," - match statements in Darklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-pipeline",children:"pipeline"})," - example of a pipeline"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-randompluck",children:"randompluck"})," - a function that\nreturns a random result"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-returns",children:"returns"})," - a variety of samples of\nreturns"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-square",children:"square"})," - shows how to implement a simple\nfunction to square an input"]}),"\n",(0,s.jsx)(e.h2,{id:"slack",children:"Slack"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slack",children:"slack"})," - common Slack functions"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackmessaging",children:"slackmessaging"})," - posting a\nmessage to a Slack channel"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackmodal",children:"slackmodal"})," - incorporating a model\ninto your Slackbot"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackoauth",children:"slackoauth"})," - integrating with\nSlack's OAuth"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slacksigning",children:"slacksigning"})," - using a Slack\nsigning secret"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-slackslashcommand",children:"slackslashcommand"})," - using a\nSlack slash command"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-magiceightball",children:"magiceightball"})," - a full magic\neight ball Slackbot"]}),"\n",(0,s.jsxs)(e.p,{children:["For a full Slackbot walk-through, click ",(0,s.jsx)(e.a,{href:"/walk-throughs/slack-app",children:"here"}),"."]}),"\n",(0,s.jsx)(e.h2,{id:"twilio",children:"Twilio"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-signin",children:"signin"})," - an office sign-in that texts\nupon arrival"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-textreminder",children:"textreminder"})," - get texted\nreminders"]}),"\n",(0,s.jsxs)(e.p,{children:["For a full Twilio tutorial, click ",(0,s.jsx)(e.a,{href:"/walk-throughs/twilio-app",children:"here"}),"."]}),"\n",(0,s.jsx)(e.h2,{id:"misc-integrations",children:"Misc. Integrations"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-airtable",children:"airtable"})," - examples of common Airtable\nAPI calls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-discord",children:"discord"})," - an Overwatch team comp\nDiscord bot"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-freshdesk",children:"freshdesk"})," - examples of common\nFreshdesk API calls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-github",children:"github"})," - examples of common GitHub API\ncalls"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-mailchimp",children:"mailchimp"})," - sending a Mailchimp\ncampaign"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-oauth",children:"oauth"})," - using Gmail's OAuth flow"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-aws-signing",children:"signing"})," - AWS signing"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-sendgrid",children:"sendgrid"})," - sending emails with the\nSendGrid API"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-twitter-auth",children:"twitter api oauth 1.0"})," - using\nTwitter's OAuth 1.0 flow"]}),"\n",(0,s.jsx)(e.h2,{id:"full-sample-projects",children:"Full Sample Projects"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-emojimood",children:"emojimood"})," - use emojis to express\nyour mood!"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-fizzbuzz",children:"fizzbuzz"})," - solving FizzBuzz in\nDarklang"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-login",children:"login"})," - a full login flow"]}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://darklang.com/a/sample-onboarding",children:"onboarding"})," - example of an easy to\nbuild project for learning Darklang"]}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsxs)(e.p,{children:["If you've built something you'd like featured as a sample canvas, let us know by\nemailing ",(0,s.jsx)(e.a,{href:"mailto:beta@darklang.com",children:"beta@darklang.com"}),"."]})]})}function d(a={}){const{wrapper:e}={...(0,l.R)(),...a.components};return e?(0,s.jsx)(e,{...a,children:(0,s.jsx)(h,{...a})}):h(a)}},28453:(a,e,n)=>{n.d(e,{R:()=>i,x:()=>t});var s=n(96540);const l={},r=s.createContext(l);function i(a){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof a?a(e):{...e,...a}}),[e,a])}function t(a){let e;return e=a.disableParentContext?"function"==typeof a.components?a.components(l):a.components||l:i(a.components),s.createElement(r.Provider,{value:e},a.children)}}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.c39ee2c2.js b/assets/js/14eb3368.c39ee2c2.js new file mode 100644 index 000000000..d5bc12475 --- /dev/null +++ b/assets/js/14eb3368.c39ee2c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6969],{71243:(e,n,r)=>{r.d(n,{A:()=>x});r(96540);var t=r(34164),s=r(17559),a=r(10712),i=r(99169),l=r(28774),o=r(21312),c=r(86025),d=r(74848);function u(e){return(0,d.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})}))}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){var e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function b(e){var n=e.children,r=e.href,t="breadcrumbs__link";return e.isLast?(0,d.jsx)("span",{className:t,itemProp:"name",children:n}):r?(0,d.jsx)(l.A,{className:t,href:r,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:t,children:n})}function g(e){var n=e.children,r=e.active,s=e.index,a=e.addMicrodata;return(0,d.jsxs)("li",Object.assign({},a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,t.A)("breadcrumbs__item",{"breadcrumbs__item--active":r}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(s+1)})]}))}function x(){var e=(0,a.OF)(),n=(0,i.Dt)();return e?(0,d.jsx)("nav",{className:(0,t.A)(s.G.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map((function(n,r){var t=r===e.length-1,s="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(g,{active:t,index:r,addMicrodata:!!s,children:(0,d.jsx)(b,{href:s,isLast:t,children:n.label})},r)}))]})}):null}},34136:(e,n,r)=>{r.r(n),r.d(n,{default:()=>w});r(96540);var t=r(69024),s=r(10712),a=r(86025),i=r(34164),l=r(28774),o=r(53465),c=r(16654),d=r(21312),u=r(51107);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=r(74848);function v(e){var n=e.href,r=e.children;return(0,h.jsx)(l.A,{href:n,className:(0,i.A)("card padding--lg",m.cardContainer),children:r})}function b(e){var n=e.href,r=e.icon,t=e.title,s=e.description;return(0,h.jsxs)(v,{href:n,children:[(0,h.jsxs)(u.A,{as:"h2",className:(0,i.A)("text--truncate",m.cardTitle),title:t,children:[r," ",t]}),s&&(0,h.jsx)("p",{className:(0,i.A)("text--truncate",m.cardDescription),title:s,children:s})]})}function g(e){var n,r,t=e.item,a=(0,s.Nr)(t),i=(r=(0,o.W)().selectMessage,function(e){return r(e,(0,d.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:e}))});return a?(0,h.jsx)(b,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:null!=(n=t.description)?n:i(t.items.length)}):null}function x(e){var n,r,t=e.item,a=(0,c.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",i=(0,s.cC)(null!=(n=t.docId)?n:void 0);return(0,h.jsx)(b,{href:t.href,icon:a,title:t.label,description:null!=(r=t.description)?r:null==i?void 0:i.description})}function p(e){var n=e.item;switch(n.type){case"link":return(0,h.jsx)(x,{item:n});case"category":return(0,h.jsx)(g,{item:n});default:throw new Error("unknown item type "+JSON.stringify(n))}}function f(e){var n=e.className,r=(0,s.$S)();return(0,h.jsx)(j,{items:r.items,className:n})}function j(e){var n=e.items,r=e.className;if(!n)return(0,h.jsx)(f,Object.assign({},e));var t=(0,s.d1)(n);return(0,h.jsx)("section",{className:(0,i.A)("row",r),children:t.map((function(e,n){return(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(p,{item:e})},n)}))})}var A=r(86929),N=r(51878),T=r(4267),L=r(71243);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function k(e){var n=e.categoryGeneratedIndex;return(0,h.jsx)(t.be,{title:n.title,description:n.description,keywords:n.keywords,image:(0,a.Ay)(n.image)})}function y(e){var n=e.categoryGeneratedIndex,r=(0,s.$S)();return(0,h.jsxs)("div",{className:_.generatedIndexPage,children:[(0,h.jsx)(N.A,{}),(0,h.jsx)(L.A,{}),(0,h.jsx)(T.A,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.A,{as:"h1",className:_.title,children:n.title}),n.description&&(0,h.jsx)("p",{children:n.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:r.items,className:_.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(A.A,{previous:n.navigation.previous,next:n.navigation.next})})]})}function w(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(k,Object.assign({},e)),(0,h.jsx)(y,Object.assign({},e))]})}},86929:(e,n,r)=>{r.d(n,{A:()=>o});r(96540);var t=r(21312),s=r(34164),a=r(28774),i=r(74848);function l(e){var n=e.permalink,r=e.title,t=e.subLabel,l=e.isNext;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[t&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:t}),(0,i.jsx)("div",{className:"pagination-nav__label",children:r})]})}function o(e){var n=e.previous,r=e.next;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,t.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,i.jsx)(l,Object.assign({},n,{subLabel:(0,i.jsx)(t.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})})),r&&(0,i.jsx)(l,Object.assign({},r,{subLabel:(0,i.jsx)(t.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0}))]})}},4267:(e,n,r)=>{r.d(n,{A:()=>o});r(96540);var t=r(34164),s=r(21312),a=r(17559),i=r(23025),l=r(74848);function o(e){var n=e.className,r=(0,i.r)();return r.badge?(0,l.jsx)("span",{className:(0,t.A)(n,a.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(s.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:r.label},children:"Version: {versionLabel}"})}):null}},51878:(e,n,r)=>{r.d(n,{A:()=>g});r(96540);var t=r(34164),s=r(44586),a=r(28774),i=r(21312),l=r(44070),o=r(17559),c=r(53886),d=r(23025),u=r(74848);var m={unreleased:function(e){var n=e.siteTitle,r=e.versionMetadata;return(0,u.jsx)(i.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:r.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){var n=e.siteTitle,r=e.versionMetadata;return(0,u.jsx)(i.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:r.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){var n=m[e.versionMetadata.banner];return(0,u.jsx)(n,Object.assign({},e))}function v(e){var n=e.versionLabel,r=e.to,t=e.onClick;return(0,u.jsx)(i.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(a.A,{to:r,onClick:t,children:(0,u.jsx)(i.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function b(e){var n,r=e.className,a=e.versionMetadata,i=(0,s.A)().siteConfig.title,d=(0,l.vT)({failfast:!0}).pluginId,m=(0,c.g1)(d).savePreferredVersionName,b=(0,l.HW)(d),g=b.latestDocSuggestion,x=b.latestVersionSuggestion,p=null!=g?g:(n=x).docs.find((function(e){return e.id===n.mainDocId}));return(0,u.jsxs)("div",{className:(0,t.A)(r,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:a})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(v,{versionLabel:x.label,to:p.path,onClick:function(){return m(x.name)}})})]})}function g(e){var n=e.className,r=(0,d.r)();return r.banner?(0,u.jsx)(b,{className:n,versionMetadata:r}):null}},53465:(e,n,r)=>{r.d(n,{W:()=>c});var t=r(96540),s=r(44586),a=["zero","one","two","few","many","other"];function i(e){return a.filter((function(n){return e.includes(n)}))}var l={locale:"en",pluralForms:i(["one","other"]),select:function(e){return 1===e?"one":"other"}};function o(){var e=(0,s.A)().i18n.currentLocale;return(0,t.useMemo)((function(){try{return n=e,r=new Intl.PluralRules(n),{locale:n,pluralForms:i(r.resolvedOptions().pluralCategories),select:function(e){return r.select(e)}}}catch(t){return console.error('Failed to use Intl.PluralRules for locale "'+e+'".\nDocusaurus will fallback to the default (English) implementation.\nError: '+t.message+"\n"),l}var n,r}),[e])}function c(){var e=o();return{selectMessage:function(n,r){return function(e,n,r){var t=e.split("|");if(1===t.length)return t[0];t.length>r.pluralForms.length&&console.error("For locale="+r.locale+", a maximum of "+r.pluralForms.length+" plural forms are expected ("+r.pluralForms.join(",")+"), but the message contains "+t.length+": "+e);var s=r.select(n),a=r.pluralForms.indexOf(s);return t[Math.min(a,t.length-1)]}(r,n,e)}}}}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.c4c20674.js b/assets/js/14eb3368.c4c20674.js deleted file mode 100644 index 661cc2e56..000000000 --- a/assets/js/14eb3368.c4c20674.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9817],{1310:(e,n,r)=>{r.d(n,{Z:()=>x});r(67294);var t=r(90512),s=r(35281),a=r(91423),i=r(48596),l=r(33692),o=r(95999),c=r(44996),d=r(85893);function u(e){return(0,d.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})}))}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){var e=(0,c.ZP)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.Z,{"aria-label":(0,o.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function b(e){var n=e.children,r=e.href,t="breadcrumbs__link";return e.isLast?(0,d.jsx)("span",{className:t,itemProp:"name",children:n}):r?(0,d.jsx)(l.Z,{className:t,href:r,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:t,children:n})}function g(e){var n=e.children,r=e.active,s=e.index,a=e.addMicrodata;return(0,d.jsxs)("li",Object.assign({},a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,t.Z)("breadcrumbs__item",{"breadcrumbs__item--active":r}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(s+1)})]}))}function x(){var e=(0,a.s1)(),n=(0,i.Ns)();return e?(0,d.jsx)("nav",{className:(0,t.Z)(s.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,o.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map((function(n,r){var t=r===e.length-1,s="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(g,{active:t,index:r,addMicrodata:!!s,children:(0,d.jsx)(b,{href:s,isLast:t,children:n.label})},r)}))]})}):null}},34228:(e,n,r)=>{r.r(n),r.d(n,{default:()=>y});r(67294);var t=r(10833),s=r(91423),a=r(44996),i=r(90512),l=r(33692),o=r(88824),c=r(13919),d=r(95999),u=r(92503);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=r(85893);function v(e){var n=e.href,r=e.children;return(0,h.jsx)(l.Z,{href:n,className:(0,i.Z)("card padding--lg",m.cardContainer),children:r})}function b(e){var n=e.href,r=e.icon,t=e.title,s=e.description;return(0,h.jsxs)(v,{href:n,children:[(0,h.jsxs)(u.Z,{as:"h2",className:(0,i.Z)("text--truncate",m.cardTitle),title:t,children:[r," ",t]}),s&&(0,h.jsx)("p",{className:(0,i.Z)("text--truncate",m.cardDescription),title:s,children:s})]})}function g(e){var n,r,t=e.item,a=(0,s.LM)(t),i=(r=(0,o.c)().selectMessage,function(e){return r(e,(0,d.I)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:e}))});return a?(0,h.jsx)(b,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:null!=(n=t.description)?n:i(t.items.length)}):null}function x(e){var n,r,t=e.item,a=(0,c.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",i=(0,s.xz)(null!=(n=t.docId)?n:void 0);return(0,h.jsx)(b,{href:t.href,icon:a,title:t.label,description:null!=(r=t.description)?r:null==i?void 0:i.description})}function p(e){var n=e.item;switch(n.type){case"link":return(0,h.jsx)(x,{item:n});case"category":return(0,h.jsx)(g,{item:n});default:throw new Error("unknown item type "+JSON.stringify(n))}}function f(e){var n=e.className,r=(0,s.jA)();return(0,h.jsx)(j,{items:r.items,className:n})}function j(e){var n=e.items,r=e.className;if(!n)return(0,h.jsx)(f,Object.assign({},e));var t=(0,s.MN)(n);return(0,h.jsx)("section",{className:(0,i.Z)("row",r),children:t.map((function(e,n){return(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(p,{item:e})},n)}))})}var N=r(4966),Z=r(23120),L=r(44364),k=r(1310);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){var n=e.categoryGeneratedIndex;return(0,h.jsx)(t.d,{title:n.title,description:n.description,keywords:n.keywords,image:(0,a.ZP)(n.image)})}function I(e){var n=e.categoryGeneratedIndex,r=(0,s.jA)();return(0,h.jsxs)("div",{className:_.generatedIndexPage,children:[(0,h.jsx)(Z.Z,{}),(0,h.jsx)(k.Z,{}),(0,h.jsx)(L.Z,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.Z,{as:"h1",className:_.title,children:n.title}),n.description&&(0,h.jsx)("p",{children:n.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:r.items,className:_.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(N.Z,{previous:n.navigation.previous,next:n.navigation.next})})]})}function y(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(T,Object.assign({},e)),(0,h.jsx)(I,Object.assign({},e))]})}},4966:(e,n,r)=>{r.d(n,{Z:()=>o});r(67294);var t=r(95999),s=r(90512),a=r(33692),i=r(85893);function l(e){var n=e.permalink,r=e.title,t=e.subLabel,l=e.isNext;return(0,i.jsxs)(a.Z,{className:(0,s.Z)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[t&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:t}),(0,i.jsx)("div",{className:"pagination-nav__label",children:r})]})}function o(e){var n=e.previous,r=e.next;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,t.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,i.jsx)(l,Object.assign({},n,{subLabel:(0,i.jsx)(t.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})})),r&&(0,i.jsx)(l,Object.assign({},r,{subLabel:(0,i.jsx)(t.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0}))]})}},44364:(e,n,r)=>{r.d(n,{Z:()=>o});r(67294);var t=r(90512),s=r(95999),a=r(35281),i=r(73797),l=r(85893);function o(e){var n=e.className,r=(0,i.E)();return r.badge?(0,l.jsx)("span",{className:(0,t.Z)(n,a.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(s.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:r.label},children:"Version: {versionLabel}"})}):null}},23120:(e,n,r)=>{r.d(n,{Z:()=>g});r(67294);var t=r(90512),s=r(52263),a=r(33692),i=r(95999),l=r(80143),o=r(35281),c=r(70298),d=r(73797),u=r(85893);var m={unreleased:function(e){var n=e.siteTitle,r=e.versionMetadata;return(0,u.jsx)(i.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:r.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){var n=e.siteTitle,r=e.versionMetadata;return(0,u.jsx)(i.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:r.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){var n=m[e.versionMetadata.banner];return(0,u.jsx)(n,Object.assign({},e))}function v(e){var n=e.versionLabel,r=e.to,t=e.onClick;return(0,u.jsx)(i.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(a.Z,{to:r,onClick:t,children:(0,u.jsx)(i.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function b(e){var n,r=e.className,a=e.versionMetadata,i=(0,s.Z)().siteConfig.title,d=(0,l.gA)({failfast:!0}).pluginId,m=(0,c.J)(d).savePreferredVersionName,b=(0,l.Jo)(d),g=b.latestDocSuggestion,x=b.latestVersionSuggestion,p=null!=g?g:(n=x).docs.find((function(e){return e.id===n.mainDocId}));return(0,u.jsxs)("div",{className:(0,t.Z)(r,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:a})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(v,{versionLabel:x.label,to:p.path,onClick:function(){return m(x.name)}})})]})}function g(e){var n=e.className,r=(0,d.E)();return r.banner?(0,u.jsx)(b,{className:n,versionMetadata:r}):null}},88824:(e,n,r)=>{r.d(n,{c:()=>c});var t=r(67294),s=r(52263),a=["zero","one","two","few","many","other"];function i(e){return a.filter((function(n){return e.includes(n)}))}var l={locale:"en",pluralForms:i(["one","other"]),select:function(e){return 1===e?"one":"other"}};function o(){var e=(0,s.Z)().i18n.currentLocale;return(0,t.useMemo)((function(){try{return n=e,r=new Intl.PluralRules(n),{locale:n,pluralForms:i(r.resolvedOptions().pluralCategories),select:function(e){return r.select(e)}}}catch(t){return console.error('Failed to use Intl.PluralRules for locale "'+e+'".\nDocusaurus will fallback to the default (English) implementation.\nError: '+t.message+"\n"),l}var n,r}),[e])}function c(){var e=o();return{selectMessage:function(n,r){return function(e,n,r){var t=e.split("|");if(1===t.length)return t[0];t.length>r.pluralForms.length&&console.error("For locale="+r.locale+", a maximum of "+r.pluralForms.length+" plural forms are expected ("+r.pluralForms.join(",")+"), but the message contains "+t.length+": "+e);var s=r.select(n),a=r.pluralForms.indexOf(s);return t[Math.min(a,t.length-1)]}(r,n,e)}}}}}]); \ No newline at end of file diff --git a/assets/js/1772.fbaa28b1.js b/assets/js/1772.fbaa28b1.js deleted file mode 100644 index 3d2bb35ce..000000000 --- a/assets/js/1772.fbaa28b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1772],{5658:(e,t,n)=>{n.d(t,{Z:()=>a});n(67294);var i=n(90512),o=n(95999),s=n(92503),r=n(85893);function a(e){var t=e.className;return(0,r.jsx)("main",{className:(0,i.Z)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.Z,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},51772:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(67294);var i=n(95999),o=n(10833),s=n(63211),r=n(5658),a=n(85893);function d(){var e=(0,i.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.d,{title:e}),(0,a.jsx)(s.Z,{children:(0,a.jsx)(r.Z,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.23c148c7.js b/assets/js/17896441.23c148c7.js deleted file mode 100644 index 7aa79ffd0..000000000 --- a/assets/js/17896441.23c148c7.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7918],{1310:(e,n,t)=>{"use strict";t.d(n,{Z:()=>p});t(67294);var a=t(90512),s=t(35281),i=t(91423),r=t(48596),o=t(33692),c=t(95999),l=t(44996),d=t(85893);function u(e){return(0,d.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})}))}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){var e=(0,l.ZP)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(o.Z,{"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const f={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function v(e){var n=e.children,t=e.href,a="breadcrumbs__link";return e.isLast?(0,d.jsx)("span",{className:a,itemProp:"name",children:n}):t?(0,d.jsx)(o.Z,{className:a,href:t,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:a,children:n})}function b(e){var n=e.children,t=e.active,s=e.index,i=e.addMicrodata;return(0,d.jsxs)("li",Object.assign({},i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,a.Z)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(s+1)})]}))}function p(){var e=(0,i.s1)(),n=(0,r.Ns)();return e?(0,d.jsx)("nav",{className:(0,a.Z)(s.k.docs.docBreadcrumbs,f.breadcrumbsContainer),"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map((function(n,t){var a=t===e.length-1,s="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(b,{active:a,index:t,addMicrodata:!!s,children:(0,d.jsx)(v,{href:s,isLast:a,children:n.label})},t)}))]})}):null}},83957:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>qn});var a=t(67294),s=t(10833),i=t(69688),r=t(85893),o=a.createContext(null);function c(e){var n=e.children,t=function(e){return(0,a.useMemo)((function(){return{metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}}),[e])}(e.content);return(0,r.jsx)(o.Provider,{value:t,children:n})}function l(){var e=(0,a.useContext)(o);if(null===e)throw new i.i6("DocProvider");return e}function d(){var e,n=l(),t=n.metadata,a=n.frontMatter,i=n.assets;return(0,r.jsx)(s.d,{title:t.title,description:t.description,keywords:a.keywords,image:null!=(e=i.image)?e:a.image})}var u=t(90512),m=t(87524),h=t(4966);function f(){var e=l().metadata;return(0,r.jsx)(h.Z,{previous:e.previous,next:e.next})}var v=t(23120),b=t(44364),p=t(35281),g=t(95999),j=t(33692);const x={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function N(e){var n=e.permalink,t=e.label,a=e.count,s=e.description;return(0,r.jsxs)(j.Z,{href:n,title:s,className:(0,u.Z)(x.tag,a?x.tagWithCount:x.tagRegular),children:[t,a&&(0,r.jsx)("span",{children:a})]})}const C={tags:"tags_jXut",tag:"tag_QGVx"};function k(e){var n=e.tags;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("b",{children:(0,r.jsx)(g.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,r.jsx)("ul",{className:(0,u.Z)(C.tags,"padding--none","margin-left--sm"),children:n.map((function(e){return(0,r.jsx)("li",{className:C.tag,children:(0,r.jsx)(N,Object.assign({},e))},e.permalink)}))})]})}var y=t(63366);const L={iconEdit:"iconEdit_Z9Sw"};var Z=["className"];function B(e){var n=e.className,t=(0,y.Z)(e,Z);return(0,r.jsx)("svg",Object.assign({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.Z)(L.iconEdit,n),"aria-hidden":"true"},t,{children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})}))}function _(e){var n=e.editUrl;return(0,r.jsxs)(j.Z,{to:n,className:p.k.common.editThisPage,children:[(0,r.jsx)(B,{}),(0,r.jsx)(g.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var w=t(52263);function T(e){void 0===e&&(e={});var n=(0,w.Z)().i18n.currentLocale,t=function(){var e=(0,w.Z)().i18n,n=e.currentLocale;return e.localeConfigs[n].calendar}();return new Intl.DateTimeFormat(n,Object.assign({calendar:t},e))}function O(e){var n=e.lastUpdatedAt,t=new Date(n),a=T({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,r.jsx)(g.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,r.jsx)("b",{children:(0,r.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:a})})},children:" on {date}"})}function E(e){var n=e.lastUpdatedBy;return(0,r.jsx)(g.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,r.jsx)("b",{children:n})},children:" by {user}"})}function H(e){var n=e.lastUpdatedAt,t=e.lastUpdatedBy;return(0,r.jsxs)("span",{className:p.k.common.lastUpdated,children:[(0,r.jsx)(g.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:n?(0,r.jsx)(O,{lastUpdatedAt:n}):"",byUser:t?(0,r.jsx)(E,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const I={lastUpdated:"lastUpdated_JAkA"};function M(e){var n=e.className,t=e.editUrl,a=e.lastUpdatedAt,s=e.lastUpdatedBy;return(0,r.jsxs)("div",{className:(0,u.Z)("row",n),children:[(0,r.jsx)("div",{className:"col",children:t&&(0,r.jsx)(_,{editUrl:t})}),(0,r.jsx)("div",{className:(0,u.Z)("col",I.lastUpdated),children:(a||s)&&(0,r.jsx)(H,{lastUpdatedAt:a,lastUpdatedBy:s})})]})}function A(){var e=l().metadata,n=e.editUrl,t=e.lastUpdatedAt,a=e.lastUpdatedBy,s=e.tags,i=s.length>0,o=!!(n||t||a);return i||o?(0,r.jsxs)("footer",{className:(0,u.Z)(p.k.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,r.jsx)("div",{className:(0,u.Z)("row margin-top--sm",p.k.docs.docFooterTagsRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(k,{tags:s})})}),o&&(0,r.jsx)(M,{className:(0,u.Z)("margin-top--sm",p.k.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:a})]}):null}var S=t(86043),U=t(86668),V=["parentIndex"];function z(e){var n=e.map((function(e){return Object.assign({},e,{parentIndex:-1,children:[]})})),t=Array(7).fill(-1);n.forEach((function(e,n){var a=t.slice(2,e.level);e.parentIndex=Math.max.apply(Math,a),t[e.level]=n}));var a=[];return n.forEach((function(e){var t=e.parentIndex,s=(0,y.Z)(e,V);t>=0?n[t].children.push(s):a.push(s)})),a}function R(e){var n=e.toc,t=e.minHeadingLevel,a=e.maxHeadingLevel;return n.flatMap((function(e){var n=R({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[Object.assign({},e,{children:n})]:n}))}function P(e){var n=e.getBoundingClientRect();return n.top===n.bottom?P(e.parentNode):n}function D(e,n){var t,a,s=n.anchorTopOffset,i=e.find((function(e){return P(e).top>=s}));return i?function(e){return e.top>0&&e.bottom",end:""}}),Ce=Object.keys(xe);function ke(e,n){var t=e.map((function(e){var t=Ne[e],a=t.start,s=t.end;return"(?:"+a+"\\s*("+n.flatMap((function(e){var n,t;return[e.line,null==(n=e.block)?void 0:n.start,null==(t=e.block)?void 0:t.end].filter(Boolean)})).join("|")+")\\s*"+s+")"})).join("|");return new RegExp("^\\s*(?:"+t+")\\s*$")}function ye(e,n){var t=e.replace(/\n$/,""),a=n.language,s=n.magicComments,i=n.metastring;if(i&&je.test(i)){var r=i.match(je).groups.range;if(0===s.length)throw new Error("A highlight range has been given in code block's metastring (``` "+i+"), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.");var o=s[0].className,c=pe()(r).filter((function(e){return e>0})).map((function(e){return[e-1,[o]]}));return{lineClassNames:Object.fromEntries(c),code:t}}if(void 0===a)return{lineClassNames:{},code:t};for(var l=function(e,n){switch(e){case"js":case"javascript":case"ts":case"typescript":return ke(["js","jsBlock"],n);case"jsx":case"tsx":return ke(["js","jsBlock","jsx"],n);case"html":return ke(["js","jsBlock","html"],n);case"python":case"py":case"bash":return ke(["bash"],n);case"markdown":case"md":return ke(["html","jsx","bash"],n);case"tex":case"latex":case"matlab":return ke(["tex"],n);case"lua":case"haskell":case"sql":return ke(["lua"],n);case"wasm":return ke(["wasm"],n);case"vb":case"vba":case"visual-basic":return ke(["vb","rem"],n);case"vbnet":return ke(["vbnet","rem"],n);case"batch":return ke(["rem"],n);case"basic":return ke(["rem","f90"],n);case"fsharp":return ke(["js","ml"],n);case"ocaml":case"sml":return ke(["ml"],n);case"fortran":return ke(["f90"],n);case"cobol":return ke(["cobol"],n);default:return ke(Ce,n)}}(a,s),d=t.split("\n"),u=Object.fromEntries(s.map((function(e){return[e.className,{start:0,range:""}]}))),m=Object.fromEntries(s.filter((function(e){return e.line})).map((function(e){var n=e.className;return[e.line,n]}))),h=Object.fromEntries(s.filter((function(e){return e.block})).map((function(e){var n=e.className;return[e.block.start,n]}))),f=Object.fromEntries(s.filter((function(e){return e.block})).map((function(e){var n=e.className;return[e.block.end,n]}))),v=0;v0&&r.getRangeAt(0);a.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;var c=!1;try{c=document.execCommand("copy")}catch(l){}s.remove(),o&&(r.removeAllRanges(),r.addRange(o)),i&&i.focus()}(n),o(!0),c.current=window.setTimeout((function(){o(!1)}),1e3)}),[n]);return(0,a.useEffect)((function(){return function(){return window.clearTimeout(c.current)}}),[]),(0,r.jsx)("button",{type:"button","aria-label":i?(0,g.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,g.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,g.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.Z)("clean-btn",t,Se.copyButton,i&&Se.copyButtonCopied),onClick:l,children:(0,r.jsxs)("span",{className:Se.copyButtonIcons,"aria-hidden":"true",children:[(0,r.jsx)(Me,{className:Se.copyButtonIcon}),(0,r.jsx)(Ae,{className:Se.copyButtonSuccessIcon})]})})}function Ve(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,r.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})}))}const ze={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Re(e){var n=e.className,t=e.onClick,a=e.isEnabled,s=(0,g.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,r.jsx)("button",{type:"button",onClick:t,className:(0,u.Z)("clean-btn",n,a&&ze.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,r.jsx)(Ve,{className:ze.wordWrapButtonIcon,"aria-hidden":"true"})})}function Pe(e){var n,t,s,i,o,c,l,d,m,h,f,v=e.children,b=e.className,p=void 0===b?"":b,g=e.metastring,j=e.title,x=e.showLineNumbers,N=e.language,C=(0,U.L)().prism,k=C.defaultLanguage,y=C.magicComments,L=function(e){return null==e?void 0:e.toLowerCase()}(null!=(n=null!=N?N:null==(t=p.split(" ").find((function(e){return e.startsWith("language-")})))?void 0:t.replace(/language-/,""))?n:k),Z=fe(),B=(s=(0,a.useState)(!1),i=s[0],o=s[1],c=(0,a.useState)(!1),l=c[0],d=c[1],m=(0,a.useRef)(null),h=(0,a.useCallback)((function(){var e=m.current.querySelector("code");i?e.removeAttribute("style"):(e.style.whiteSpace="pre-wrap",e.style.overflowWrap="anywhere"),o((function(e){return!e}))}),[m,i]),f=(0,a.useCallback)((function(){var e=m.current,n=e.scrollWidth>e.clientWidth||m.current.querySelector("code").hasAttribute("style");d(n)}),[m]),Oe(m,f),(0,a.useEffect)((function(){f()}),[i,f]),(0,a.useEffect)((function(){return window.addEventListener("resize",f,{passive:!0}),function(){window.removeEventListener("resize",f)}}),[f]),{codeBlockRef:m,isEnabled:i,isCodeScrollable:l,toggle:h}),_=function(e){var n,t;return null!=(n=null==e||null==(t=e.match(ge))?void 0:t.groups.title)?n:""}(g)||j,w=ye(v,{metastring:g,language:L,magicComments:y}),T=w.lineClassNames,O=w.code,E=null!=x?x:function(e){return Boolean(null==e?void 0:e.includes("showLineNumbers"))}(g);return(0,r.jsxs)(Be,{as:"div",className:(0,u.Z)(p,L&&!p.includes("language-"+L)&&"language-"+L),children:[_&&(0,r.jsx)("div",{className:_e.codeBlockTitle,children:_}),(0,r.jsxs)("div",{className:_e.codeBlockContent,children:[(0,r.jsx)(Ee.y$,{theme:Z,code:O,language:null!=L?L:"text",children:function(e){var n=e.className,t=e.style,a=e.tokens,s=e.getLineProps,i=e.getTokenProps;return(0,r.jsx)("pre",{tabIndex:0,ref:B.codeBlockRef,className:(0,u.Z)(n,_e.codeBlock,"thin-scrollbar"),style:t,children:(0,r.jsx)("code",{className:(0,u.Z)(_e.codeBlockLines,E&&_e.codeBlockLinesWithNumbering),children:a.map((function(e,n){return(0,r.jsx)(Ie,{line:e,getLineProps:s,getTokenProps:i,classNames:T[n],showLineNumbers:E},n)}))})})}}),(0,r.jsxs)("div",{className:_e.buttonGroup,children:[(B.isEnabled||B.isCodeScrollable)&&(0,r.jsx)(Re,{className:_e.codeButton,onClick:function(){return B.toggle()},isEnabled:B.isEnabled}),(0,r.jsx)(Ue,{className:_e.codeButton,code:O})]})]})]})}var De=["children"];function We(e){var n=e.children,t=(0,y.Z)(e,De),s=(0,me.Z)(),i=function(e){return a.Children.toArray(e).some((function(e){return(0,a.isValidElement)(e)}))?e:Array.isArray(e)?e.join(""):e}(n),o="string"==typeof i?Pe:we;return(0,r.jsx)(o,Object.assign({},t,{children:i}),String(s))}function Fe(e){return(0,r.jsx)("code",Object.assign({},e))}var qe=t(28138);const Ge={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var Je=["summary","children"];function $e(e){return!!e&&("SUMMARY"===e.tagName||$e(e.parentElement))}function Ye(e,n){return!!e&&(e===n||Ye(e.parentElement,n))}function Qe(e){var n=e.summary,t=e.children,s=(0,y.Z)(e,Je);(0,qe.Z)().collectAnchor(s.id);var i=(0,me.Z)(),o=(0,a.useRef)(null),c=(0,S.u)({initialState:!s.open}),l=c.collapsed,d=c.setCollapsed,m=(0,a.useState)(s.open),h=m[0],f=m[1],v=a.isValidElement(n)?n:(0,r.jsx)("summary",{children:null!=n?n:"Details"});return(0,r.jsxs)("details",Object.assign({},s,{ref:o,open:h,"data-collapsed":l,className:(0,u.Z)(Ge.details,i&&Ge.isBrowser,s.className),onMouseDown:function(e){$e(e.target)&&e.detail>1&&e.preventDefault()},onClick:function(e){e.stopPropagation();var n=e.target;$e(n)&&Ye(n,o.current)&&(e.preventDefault(),l?(d(!1),f(!0)):d(!0))},children:[v,(0,r.jsx)(S.z,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:function(e){d(e),f(!e)},children:(0,r.jsx)("div",{className:Ge.collapsibleContent,children:t})})]}))}const Xe={details:"details_b_Ee"};var Ke="alert alert--info";function en(e){var n=Object.assign({},(function(e){if(null==e)throw new TypeError("Cannot destructure "+e)}(e),e));return(0,r.jsx)(Qe,Object.assign({},n,{className:(0,u.Z)(Ke,Xe.details,n.className)}))}function nn(e){var n=a.Children.toArray(e.children),t=n.find((function(e){return a.isValidElement(e)&&"summary"===e.type})),s=(0,r.jsx)(r.Fragment,{children:n.filter((function(e){return e!==t}))});return(0,r.jsx)(en,Object.assign({},e,{summary:t,children:s}))}function tn(e){return(0,r.jsx)(le.Z,Object.assign({},e))}const an={containsTaskList:"containsTaskList_mC6p"};function sn(e){if(void 0!==e)return(0,u.Z)(e,(null==e?void 0:e.includes("contains-task-list"))&&an.containsTaskList)}const rn={img:"img_ev3q"};function on(e){var n,t=function(e){var n=a.Children.toArray(e),t=n.find((function(e){return a.isValidElement(e)&&"mdxAdmonitionTitle"===e.type})),s=n.filter((function(e){return e!==t}));return{mdxAdmonitionTitle:null==t?void 0:t.props.children,rest:s.length>0?(0,r.jsx)(r.Fragment,{children:s}):null}}(e.children),s=t.mdxAdmonitionTitle,i=t.rest,o=null!=(n=e.title)?n:s;return Object.assign({},e,o&&{title:o},{children:i})}const cn={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function ln(e){var n=e.type,t=e.className,a=e.children;return(0,r.jsx)("div",{className:(0,u.Z)(p.k.common.admonition,p.k.common.admonitionType(n),cn.admonition,t),children:a})}function dn(e){var n=e.icon,t=e.title;return(0,r.jsxs)("div",{className:cn.admonitionHeading,children:[(0,r.jsx)("span",{className:cn.admonitionIcon,children:n}),t]})}function un(e){var n=e.children;return n?(0,r.jsx)("div",{className:cn.admonitionContent,children:n}):null}function mn(e){var n=e.type,t=e.icon,a=e.title,s=e.children,i=e.className;return(0,r.jsxs)(ln,{type:n,className:i,children:[a||t?(0,r.jsx)(dn,{title:a,icon:t}):null,(0,r.jsx)(un,{children:s})]})}function hn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 14 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})}))}var fn={icon:(0,r.jsx)(hn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function vn(e){return(0,r.jsx)(mn,Object.assign({},fn,e,{className:(0,u.Z)("alert alert--secondary",e.className),children:e.children}))}function bn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 12 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})}))}var pn={icon:(0,r.jsx)(bn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function gn(e){return(0,r.jsx)(mn,Object.assign({},pn,e,{className:(0,u.Z)("alert alert--success",e.className),children:e.children}))}function jn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 14 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})}))}var xn={icon:(0,r.jsx)(jn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function Nn(e){return(0,r.jsx)(mn,Object.assign({},xn,e,{className:(0,u.Z)("alert alert--info",e.className),children:e.children}))}function Cn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 16 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})}))}var kn={icon:(0,r.jsx)(Cn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function yn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 12 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})}))}var Ln={icon:(0,r.jsx)(yn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};var Zn={icon:(0,r.jsx)(Cn,{}),title:(0,r.jsx)(g.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};var Bn={note:vn,tip:gn,info:Nn,warning:function(e){return(0,r.jsx)(mn,Object.assign({},kn,e,{className:(0,u.Z)("alert alert--warning",e.className),children:e.children}))},danger:function(e){return(0,r.jsx)(mn,Object.assign({},Ln,e,{className:(0,u.Z)("alert alert--danger",e.className),children:e.children}))}},_n={secondary:function(e){return(0,r.jsx)(vn,Object.assign({title:"secondary"},e))},important:function(e){return(0,r.jsx)(Nn,Object.assign({title:"important"},e))},success:function(e){return(0,r.jsx)(gn,Object.assign({title:"success"},e))},caution:function(e){return(0,r.jsx)(mn,Object.assign({},Zn,e,{className:(0,u.Z)("alert alert--warning",e.className),children:e.children}))}};const wn=Object.assign({},Bn,_n);function Tn(e){var n,t=on(e),a=(n=t.type,wn[n]||(console.warn('No admonition component found for admonition type "'+n+'". Using Info as fallback.'),wn.info));return(0,r.jsx)(a,Object.assign({},t))}const On={Head:ue.Z,details:nn,Details:nn,code:function(e){return function(e){return void 0!==e.children&&a.Children.toArray(e.children).every((function(e){return"string"==typeof e&&!e.includes("\n")}))}(e)?(0,r.jsx)(Fe,Object.assign({},e)):(0,r.jsx)(We,Object.assign({},e))},a:function(e){return(0,r.jsx)(j.Z,Object.assign({},e))},pre:function(e){return(0,r.jsx)(r.Fragment,{children:e.children})},ul:function(e){return(0,r.jsx)("ul",Object.assign({},e,{className:sn(e.className)}))},li:function(e){return(0,qe.Z)().collectAnchor(e.id),(0,r.jsx)("li",Object.assign({},e))},img:function(e){return(0,r.jsx)("img",Object.assign({decoding:"async",loading:"lazy"},e,{className:(n=e.className,(0,u.Z)(n,rn.img))}));var n},h1:function(e){return(0,r.jsx)(tn,Object.assign({as:"h1"},e))},h2:function(e){return(0,r.jsx)(tn,Object.assign({as:"h2"},e))},h3:function(e){return(0,r.jsx)(tn,Object.assign({as:"h3"},e))},h4:function(e){return(0,r.jsx)(tn,Object.assign({as:"h4"},e))},h5:function(e){return(0,r.jsx)(tn,Object.assign({as:"h5"},e))},h6:function(e){return(0,r.jsx)(tn,Object.assign({as:"h6"},e))},admonition:Tn,mermaid:function(){return null}};function En(e){var n=e.children;return(0,r.jsx)(de.Z,{components:On,children:n})}function Hn(e){var n,t,a,s,i=e.children,o=(n=l(),t=n.metadata,a=n.frontMatter,s=n.contentTitle,a.hide_title||void 0!==s?null:t.title);return(0,r.jsxs)("div",{className:(0,u.Z)(p.k.docs.docMarkdown,"markdown"),children:[o&&(0,r.jsx)("header",{children:(0,r.jsx)(le.Z,{as:"h1",children:o})}),(0,r.jsx)(En,{children:i})]})}var In=t(1310);function Mn(){return(0,r.jsx)(g.Z,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function An(){return(0,r.jsx)(g.Z,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Sn(){return(0,r.jsx)(ue.Z,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Un(){return(0,r.jsx)(g.Z,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function Vn(){return(0,r.jsx)(g.Z,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}function zn(e){var n=e.className;return(0,r.jsx)(Tn,{type:"caution",title:(0,r.jsx)(Un,{}),className:(0,u.Z)(n,p.k.common.draftBanner),children:(0,r.jsx)(Vn,{})})}function Rn(e){var n=e.className;return(0,r.jsx)(Tn,{type:"caution",title:(0,r.jsx)(Mn,{}),className:(0,u.Z)(n,p.k.common.unlistedBanner),children:(0,r.jsx)(An,{})})}function Pn(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(Sn,{}),(0,r.jsx)(Rn,Object.assign({},e))]})}function Dn(e){var n=e.metadata,t=n.unlisted,a=n.frontMatter;return(0,r.jsxs)(r.Fragment,{children:[(t||a.unlisted)&&(0,r.jsx)(Pn,{}),a.draft&&(0,r.jsx)(zn,{})]})}const Wn={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Fn(e){var n,t,a,s,i,o,c=e.children,d=(n=l(),t=n.frontMatter,a=n.toc,s=(0,m.i)(),i=t.hide_table_of_contents,o=!i&&a.length>0,{hidden:i,mobile:o?(0,r.jsx)(te,{}):void 0,desktop:!o||"desktop"!==s&&"ssr"!==s?void 0:(0,r.jsx)(ce,{})}),h=l().metadata;return(0,r.jsxs)("div",{className:"row",children:[(0,r.jsxs)("div",{className:(0,u.Z)("col",!d.hidden&&Wn.docItemCol),children:[(0,r.jsx)(Dn,{metadata:h}),(0,r.jsx)(v.Z,{}),(0,r.jsxs)("div",{className:Wn.docItemContainer,children:[(0,r.jsxs)("article",{children:[(0,r.jsx)(In.Z,{}),(0,r.jsx)(b.Z,{}),d.mobile,(0,r.jsx)(Hn,{children:c}),(0,r.jsx)(A,{})]}),(0,r.jsx)(f,{})]})]}),d.desktop&&(0,r.jsx)("div",{className:"col col--3",children:d.desktop})]})}function qn(e){var n="docs-doc-id-"+e.content.metadata.id,t=e.content;return(0,r.jsx)(c,{content:e.content,children:(0,r.jsxs)(s.FG,{className:n,children:[(0,r.jsx)(d,{}),(0,r.jsx)(Fn,{children:(0,r.jsx)(t,{})})]})})}},4966:(e,n,t)=>{"use strict";t.d(n,{Z:()=>c});t(67294);var a=t(95999),s=t(90512),i=t(33692),r=t(85893);function o(e){var n=e.permalink,t=e.title,a=e.subLabel,o=e.isNext;return(0,r.jsxs)(i.Z,{className:(0,s.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[a&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,r.jsx)("div",{className:"pagination-nav__label",children:t})]})}function c(e){var n=e.previous,t=e.next;return(0,r.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,a.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,r.jsx)(o,Object.assign({},n,{subLabel:(0,r.jsx)(a.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})})),t&&(0,r.jsx)(o,Object.assign({},t,{subLabel:(0,r.jsx)(a.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0}))]})}},44364:(e,n,t)=>{"use strict";t.d(n,{Z:()=>c});t(67294);var a=t(90512),s=t(95999),i=t(35281),r=t(73797),o=t(85893);function c(e){var n=e.className,t=(0,r.E)();return t.badge?(0,o.jsx)("span",{className:(0,a.Z)(n,i.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(s.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},23120:(e,n,t)=>{"use strict";t.d(n,{Z:()=>b});t(67294);var a=t(90512),s=t(52263),i=t(33692),r=t(95999),o=t(80143),c=t(35281),l=t(70298),d=t(73797),u=t(85893);var m={unreleased:function(e){var n=e.siteTitle,t=e.versionMetadata;return(0,u.jsx)(r.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){var n=e.siteTitle,t=e.versionMetadata;return(0,u.jsx)(r.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){var n=m[e.versionMetadata.banner];return(0,u.jsx)(n,Object.assign({},e))}function f(e){var n=e.versionLabel,t=e.to,a=e.onClick;return(0,u.jsx)(r.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.Z,{to:t,onClick:a,children:(0,u.jsx)(r.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function v(e){var n,t=e.className,i=e.versionMetadata,r=(0,s.Z)().siteConfig.title,d=(0,o.gA)({failfast:!0}).pluginId,m=(0,l.J)(d).savePreferredVersionName,v=(0,o.Jo)(d),b=v.latestDocSuggestion,p=v.latestVersionSuggestion,g=null!=b?b:(n=p).docs.find((function(e){return e.id===n.mainDocId}));return(0,u.jsxs)("div",{className:(0,a.Z)(t,c.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:r,versionMetadata:i})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(f,{versionLabel:p.label,to:g.path,onClick:function(){return m(p.name)}})})]})}function b(e){var n=e.className,t=(0,d.E)();return t.banner?(0,u.jsx)(v,{className:n,versionMetadata:t}):null}},87594:(e,n)=>{function t(e){let n,t=[];for(let a of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(a))t.push(parseInt(a,10));else if(n=a.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,a,s,i]=n;if(a&&i){a=parseInt(a),i=parseInt(i);const e=a{"use strict";t.d(n,{Z:()=>o,a:()=>r});var a=t(67294);const s={},i=a.createContext(s);function r(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.7b336f20.js b/assets/js/17896441.7b336f20.js new file mode 100644 index 000000000..6a6e7bf08 --- /dev/null +++ b/assets/js/17896441.7b336f20.js @@ -0,0 +1 @@ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8401],{71243:(e,n,t)=>{"use strict";t.d(n,{A:()=>p});t(96540);var a=t(34164),s=t(17559),i=t(10712),r=t(99169),o=t(28774),c=t(21312),l=t(86025),d=t(74848);function u(e){return(0,d.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})}))}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){var e=(0,l.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(o.A,{"aria-label":(0,c.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const f={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function v(e){var n=e.children,t=e.href,a="breadcrumbs__link";return e.isLast?(0,d.jsx)("span",{className:a,itemProp:"name",children:n}):t?(0,d.jsx)(o.A,{className:a,href:t,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:n})}):(0,d.jsx)("span",{className:a,children:n})}function b(e){var n=e.children,t=e.active,s=e.index,i=e.addMicrodata;return(0,d.jsxs)("li",Object.assign({},i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,a.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,d.jsx)("meta",{itemProp:"position",content:String(s+1)})]}))}function p(){var e=(0,i.OF)(),n=(0,r.Dt)();return e?(0,d.jsx)("nav",{className:(0,a.A)(s.G.docs.docBreadcrumbs,f.breadcrumbsContainer),"aria-label":(0,c.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,d.jsx)(h,{}),e.map((function(n,t){var a=t===e.length-1,s="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,d.jsx)(b,{active:a,index:t,addMicrodata:!!s,children:(0,d.jsx)(v,{href:s,isLast:a,children:n.label})},t)}))]})}):null}},39765:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>qn});var a=t(96540),s=t(69024),i=t(43807),r=t(74848),o=a.createContext(null);function c(e){var n=e.children,t=function(e){return(0,a.useMemo)((function(){return{metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}}),[e])}(e.content);return(0,r.jsx)(o.Provider,{value:t,children:n})}function l(){var e=(0,a.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){var e,n=l(),t=n.metadata,a=n.frontMatter,i=n.assets;return(0,r.jsx)(s.be,{title:t.title,description:t.description,keywords:a.keywords,image:null!=(e=i.image)?e:a.image})}var u=t(34164),m=t(24581),h=t(86929);function f(){var e=l().metadata;return(0,r.jsx)(h.A,{previous:e.previous,next:e.next})}var v=t(51878),b=t(4267),p=t(17559),g=t(21312),j=t(28774);const x={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function N(e){var n=e.permalink,t=e.label,a=e.count,s=e.description;return(0,r.jsxs)(j.A,{href:n,title:s,className:(0,u.A)(x.tag,a?x.tagWithCount:x.tagRegular),children:[t,a&&(0,r.jsx)("span",{children:a})]})}const A={tags:"tags_jXut",tag:"tag_QGVx"};function C(e){var n=e.tags;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("b",{children:(0,r.jsx)(g.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,r.jsx)("ul",{className:(0,u.A)(A.tags,"padding--none","margin-left--sm"),children:n.map((function(e){return(0,r.jsx)("li",{className:A.tag,children:(0,r.jsx)(N,Object.assign({},e))},e.permalink)}))})]})}var y=t(98587);const k={iconEdit:"iconEdit_Z9Sw"};var L=["className"];function B(e){var n=e.className,t=(0,y.A)(e,L);return(0,r.jsx)("svg",Object.assign({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(k.iconEdit,n),"aria-hidden":"true"},t,{children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})}))}function _(e){var n=e.editUrl;return(0,r.jsxs)(j.A,{to:n,className:p.G.common.editThisPage,children:[(0,r.jsx)(B,{}),(0,r.jsx)(g.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var w=t(44586);function T(e){void 0===e&&(e={});var n=(0,w.A)().i18n.currentLocale,t=function(){var e=(0,w.A)().i18n,n=e.currentLocale;return e.localeConfigs[n].calendar}();return new Intl.DateTimeFormat(n,Object.assign({calendar:t},e))}function O(e){var n=e.lastUpdatedAt,t=new Date(n),a=T({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(t);return(0,r.jsx)(g.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,r.jsx)("b",{children:(0,r.jsx)("time",{dateTime:t.toISOString(),itemProp:"dateModified",children:a})})},children:" on {date}"})}function E(e){var n=e.lastUpdatedBy;return(0,r.jsx)(g.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,r.jsx)("b",{children:n})},children:" by {user}"})}function H(e){var n=e.lastUpdatedAt,t=e.lastUpdatedBy;return(0,r.jsxs)("span",{className:p.G.common.lastUpdated,children:[(0,r.jsx)(g.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:n?(0,r.jsx)(O,{lastUpdatedAt:n}):"",byUser:t?(0,r.jsx)(E,{lastUpdatedBy:t}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const M={lastUpdated:"lastUpdated_JAkA"};function I(e){var n=e.className,t=e.editUrl,a=e.lastUpdatedAt,s=e.lastUpdatedBy;return(0,r.jsxs)("div",{className:(0,u.A)("row",n),children:[(0,r.jsx)("div",{className:"col",children:t&&(0,r.jsx)(_,{editUrl:t})}),(0,r.jsx)("div",{className:(0,u.A)("col",M.lastUpdated),children:(a||s)&&(0,r.jsx)(H,{lastUpdatedAt:a,lastUpdatedBy:s})})]})}function S(){var e=l().metadata,n=e.editUrl,t=e.lastUpdatedAt,a=e.lastUpdatedBy,s=e.tags,i=s.length>0,o=!!(n||t||a);return i||o?(0,r.jsxs)("footer",{className:(0,u.A)(p.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,r.jsx)("div",{className:(0,u.A)("row margin-top--sm",p.G.docs.docFooterTagsRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(C,{tags:s})})}),o&&(0,r.jsx)(I,{className:(0,u.A)("margin-top--sm",p.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:a})]}):null}var U=t(41422),V=t(6342),R=["parentIndex"];function z(e){var n=e.map((function(e){return Object.assign({},e,{parentIndex:-1,children:[]})})),t=Array(7).fill(-1);n.forEach((function(e,n){var a=t.slice(2,e.level);e.parentIndex=Math.max.apply(Math,a),t[e.level]=n}));var a=[];return n.forEach((function(e){var t=e.parentIndex,s=(0,y.A)(e,R);t>=0?n[t].children.push(s):a.push(s)})),a}function P(e){var n=e.toc,t=e.minHeadingLevel,a=e.maxHeadingLevel;return n.flatMap((function(e){var n=P({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[Object.assign({},e,{children:n})]:n}))}function G(e){var n=e.getBoundingClientRect();return n.top===n.bottom?G(e.parentNode):n}function D(e,n){var t,a,s=n.anchorTopOffset,i=e.find((function(e){return G(e).top>=s}));return i?function(e){return e.top>0&&e.bottom",end:""}}),Ae=Object.keys(xe);function Ce(e,n){var t=e.map((function(e){var t=Ne[e],a=t.start,s=t.end;return"(?:"+a+"\\s*("+n.flatMap((function(e){var n,t;return[e.line,null==(n=e.block)?void 0:n.start,null==(t=e.block)?void 0:t.end].filter(Boolean)})).join("|")+")\\s*"+s+")"})).join("|");return new RegExp("^\\s*(?:"+t+")\\s*$")}function ye(e,n){var t=e.replace(/\n$/,""),a=n.language,s=n.magicComments,i=n.metastring;if(i&&je.test(i)){var r=i.match(je).groups.range;if(0===s.length)throw new Error("A highlight range has been given in code block's metastring (``` "+i+"), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.");var o=s[0].className,c=pe()(r).filter((function(e){return e>0})).map((function(e){return[e-1,[o]]}));return{lineClassNames:Object.fromEntries(c),code:t}}if(void 0===a)return{lineClassNames:{},code:t};for(var l=function(e,n){switch(e){case"js":case"javascript":case"ts":case"typescript":return Ce(["js","jsBlock"],n);case"jsx":case"tsx":return Ce(["js","jsBlock","jsx"],n);case"html":return Ce(["js","jsBlock","html"],n);case"python":case"py":case"bash":return Ce(["bash"],n);case"markdown":case"md":return Ce(["html","jsx","bash"],n);case"tex":case"latex":case"matlab":return Ce(["tex"],n);case"lua":case"haskell":case"sql":return Ce(["lua"],n);case"wasm":return Ce(["wasm"],n);case"vb":case"vba":case"visual-basic":return Ce(["vb","rem"],n);case"vbnet":return Ce(["vbnet","rem"],n);case"batch":return Ce(["rem"],n);case"basic":return Ce(["rem","f90"],n);case"fsharp":return Ce(["js","ml"],n);case"ocaml":case"sml":return Ce(["ml"],n);case"fortran":return Ce(["f90"],n);case"cobol":return Ce(["cobol"],n);default:return Ce(Ae,n)}}(a,s),d=t.split("\n"),u=Object.fromEntries(s.map((function(e){return[e.className,{start:0,range:""}]}))),m=Object.fromEntries(s.filter((function(e){return e.line})).map((function(e){var n=e.className;return[e.line,n]}))),h=Object.fromEntries(s.filter((function(e){return e.block})).map((function(e){var n=e.className;return[e.block.start,n]}))),f=Object.fromEntries(s.filter((function(e){return e.block})).map((function(e){var n=e.className;return[e.block.end,n]}))),v=0;v0&&r.getRangeAt(0);a.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;var c=!1;try{c=document.execCommand("copy")}catch(l){}s.remove(),o&&(r.removeAllRanges(),r.addRange(o)),i&&i.focus()}(n),o(!0),c.current=window.setTimeout((function(){o(!1)}),1e3)}),[n]);return(0,a.useEffect)((function(){return function(){return window.clearTimeout(c.current)}}),[]),(0,r.jsx)("button",{type:"button","aria-label":i?(0,g.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,g.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,g.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",t,Ue.copyButton,i&&Ue.copyButtonCopied),onClick:l,children:(0,r.jsxs)("span",{className:Ue.copyButtonIcons,"aria-hidden":"true",children:[(0,r.jsx)(Ie,{className:Ue.copyButtonIcon}),(0,r.jsx)(Se,{className:Ue.copyButtonSuccessIcon})]})})}function Re(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 24 24"},e,{children:(0,r.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})}))}const ze={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Pe(e){var n=e.className,t=e.onClick,a=e.isEnabled,s=(0,g.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,r.jsx)("button",{type:"button",onClick:t,className:(0,u.A)("clean-btn",n,a&&ze.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,r.jsx)(Re,{className:ze.wordWrapButtonIcon,"aria-hidden":"true"})})}function Ge(e){var n,t,s,i,o,c,l,d,m,h,f,v=e.children,b=e.className,p=void 0===b?"":b,g=e.metastring,j=e.title,x=e.showLineNumbers,N=e.language,A=(0,V.p)().prism,C=A.defaultLanguage,y=A.magicComments,k=function(e){return null==e?void 0:e.toLowerCase()}(null!=(n=null!=N?N:null==(t=p.split(" ").find((function(e){return e.startsWith("language-")})))?void 0:t.replace(/language-/,""))?n:C),L=fe(),B=(s=(0,a.useState)(!1),i=s[0],o=s[1],c=(0,a.useState)(!1),l=c[0],d=c[1],m=(0,a.useRef)(null),h=(0,a.useCallback)((function(){var e=m.current.querySelector("code");i?e.removeAttribute("style"):(e.style.whiteSpace="pre-wrap",e.style.overflowWrap="anywhere"),o((function(e){return!e}))}),[m,i]),f=(0,a.useCallback)((function(){var e=m.current,n=e.scrollWidth>e.clientWidth||m.current.querySelector("code").hasAttribute("style");d(n)}),[m]),Oe(m,f),(0,a.useEffect)((function(){f()}),[i,f]),(0,a.useEffect)((function(){return window.addEventListener("resize",f,{passive:!0}),function(){window.removeEventListener("resize",f)}}),[f]),{codeBlockRef:m,isEnabled:i,isCodeScrollable:l,toggle:h}),_=function(e){var n,t;return null!=(n=null==e||null==(t=e.match(ge))?void 0:t.groups.title)?n:""}(g)||j,w=ye(v,{metastring:g,language:k,magicComments:y}),T=w.lineClassNames,O=w.code,E=null!=x?x:function(e){return Boolean(null==e?void 0:e.includes("showLineNumbers"))}(g);return(0,r.jsxs)(Be,{as:"div",className:(0,u.A)(p,k&&!p.includes("language-"+k)&&"language-"+k),children:[_&&(0,r.jsx)("div",{className:_e.codeBlockTitle,children:_}),(0,r.jsxs)("div",{className:_e.codeBlockContent,children:[(0,r.jsx)(Ee.f4,{theme:L,code:O,language:null!=k?k:"text",children:function(e){var n=e.className,t=e.style,a=e.tokens,s=e.getLineProps,i=e.getTokenProps;return(0,r.jsx)("pre",{tabIndex:0,ref:B.codeBlockRef,className:(0,u.A)(n,_e.codeBlock,"thin-scrollbar"),style:t,children:(0,r.jsx)("code",{className:(0,u.A)(_e.codeBlockLines,E&&_e.codeBlockLinesWithNumbering),children:a.map((function(e,n){return(0,r.jsx)(Me,{line:e,getLineProps:s,getTokenProps:i,classNames:T[n],showLineNumbers:E},n)}))})})}}),(0,r.jsxs)("div",{className:_e.buttonGroup,children:[(B.isEnabled||B.isCodeScrollable)&&(0,r.jsx)(Pe,{className:_e.codeButton,onClick:function(){return B.toggle()},isEnabled:B.isEnabled}),(0,r.jsx)(Ve,{className:_e.codeButton,code:O})]})]})]})}var De=["children"];function We(e){var n=e.children,t=(0,y.A)(e,De),s=(0,me.A)(),i=function(e){return a.Children.toArray(e).some((function(e){return(0,a.isValidElement)(e)}))?e:Array.isArray(e)?e.join(""):e}(n),o="string"==typeof i?Ge:we;return(0,r.jsx)(o,Object.assign({},t,{children:i}),String(s))}function Fe(e){return(0,r.jsx)("code",Object.assign({},e))}var qe=t(63427);const Ze={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};var $e=["summary","children"];function Je(e){return!!e&&("SUMMARY"===e.tagName||Je(e.parentElement))}function Ye(e,n){return!!e&&(e===n||Ye(e.parentElement,n))}function Ke(e){var n=e.summary,t=e.children,s=(0,y.A)(e,$e);(0,qe.A)().collectAnchor(s.id);var i=(0,me.A)(),o=(0,a.useRef)(null),c=(0,U.u)({initialState:!s.open}),l=c.collapsed,d=c.setCollapsed,m=(0,a.useState)(s.open),h=m[0],f=m[1],v=a.isValidElement(n)?n:(0,r.jsx)("summary",{children:null!=n?n:"Details"});return(0,r.jsxs)("details",Object.assign({},s,{ref:o,open:h,"data-collapsed":l,className:(0,u.A)(Ze.details,i&&Ze.isBrowser,s.className),onMouseDown:function(e){Je(e.target)&&e.detail>1&&e.preventDefault()},onClick:function(e){e.stopPropagation();var n=e.target;Je(n)&&Ye(n,o.current)&&(e.preventDefault(),l?(d(!1),f(!0)):d(!0))},children:[v,(0,r.jsx)(U.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:function(e){d(e),f(!e)},children:(0,r.jsx)("div",{className:Ze.collapsibleContent,children:t})})]}))}const Qe={details:"details_b_Ee"};var Xe="alert alert--info";function en(e){var n=Object.assign({},(function(e){if(null==e)throw new TypeError("Cannot destructure "+e)}(e),e));return(0,r.jsx)(Ke,Object.assign({},n,{className:(0,u.A)(Xe,Qe.details,n.className)}))}function nn(e){var n=a.Children.toArray(e.children),t=n.find((function(e){return a.isValidElement(e)&&"summary"===e.type})),s=(0,r.jsx)(r.Fragment,{children:n.filter((function(e){return e!==t}))});return(0,r.jsx)(en,Object.assign({},e,{summary:t,children:s}))}function tn(e){return(0,r.jsx)(le.A,Object.assign({},e))}const an={containsTaskList:"containsTaskList_mC6p"};function sn(e){if(void 0!==e)return(0,u.A)(e,(null==e?void 0:e.includes("contains-task-list"))&&an.containsTaskList)}const rn={img:"img_ev3q"};function on(e){var n,t=function(e){var n=a.Children.toArray(e),t=n.find((function(e){return a.isValidElement(e)&&"mdxAdmonitionTitle"===e.type})),s=n.filter((function(e){return e!==t}));return{mdxAdmonitionTitle:null==t?void 0:t.props.children,rest:s.length>0?(0,r.jsx)(r.Fragment,{children:s}):null}}(e.children),s=t.mdxAdmonitionTitle,i=t.rest,o=null!=(n=e.title)?n:s;return Object.assign({},e,o&&{title:o},{children:i})}const cn={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function ln(e){var n=e.type,t=e.className,a=e.children;return(0,r.jsx)("div",{className:(0,u.A)(p.G.common.admonition,p.G.common.admonitionType(n),cn.admonition,t),children:a})}function dn(e){var n=e.icon,t=e.title;return(0,r.jsxs)("div",{className:cn.admonitionHeading,children:[(0,r.jsx)("span",{className:cn.admonitionIcon,children:n}),t]})}function un(e){var n=e.children;return n?(0,r.jsx)("div",{className:cn.admonitionContent,children:n}):null}function mn(e){var n=e.type,t=e.icon,a=e.title,s=e.children,i=e.className;return(0,r.jsxs)(ln,{type:n,className:i,children:[a||t?(0,r.jsx)(dn,{title:a,icon:t}):null,(0,r.jsx)(un,{children:s})]})}function hn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 14 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})}))}var fn={icon:(0,r.jsx)(hn,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function vn(e){return(0,r.jsx)(mn,Object.assign({},fn,e,{className:(0,u.A)("alert alert--secondary",e.className),children:e.children}))}function bn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 12 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})}))}var pn={icon:(0,r.jsx)(bn,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function gn(e){return(0,r.jsx)(mn,Object.assign({},pn,e,{className:(0,u.A)("alert alert--success",e.className),children:e.children}))}function jn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 14 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})}))}var xn={icon:(0,r.jsx)(jn,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function Nn(e){return(0,r.jsx)(mn,Object.assign({},xn,e,{className:(0,u.A)("alert alert--info",e.className),children:e.children}))}function An(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 16 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})}))}var Cn={icon:(0,r.jsx)(An,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function yn(e){return(0,r.jsx)("svg",Object.assign({viewBox:"0 0 12 16"},e,{children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})}))}var kn={icon:(0,r.jsx)(yn,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};var Ln={icon:(0,r.jsx)(An,{}),title:(0,r.jsx)(g.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};var Bn={note:vn,tip:gn,info:Nn,warning:function(e){return(0,r.jsx)(mn,Object.assign({},Cn,e,{className:(0,u.A)("alert alert--warning",e.className),children:e.children}))},danger:function(e){return(0,r.jsx)(mn,Object.assign({},kn,e,{className:(0,u.A)("alert alert--danger",e.className),children:e.children}))}},_n={secondary:function(e){return(0,r.jsx)(vn,Object.assign({title:"secondary"},e))},important:function(e){return(0,r.jsx)(Nn,Object.assign({title:"important"},e))},success:function(e){return(0,r.jsx)(gn,Object.assign({title:"success"},e))},caution:function(e){return(0,r.jsx)(mn,Object.assign({},Ln,e,{className:(0,u.A)("alert alert--warning",e.className),children:e.children}))}};const wn=Object.assign({},Bn,_n);function Tn(e){var n,t=on(e),a=(n=t.type,wn[n]||(console.warn('No admonition component found for admonition type "'+n+'". Using Info as fallback.'),wn.info));return(0,r.jsx)(a,Object.assign({},t))}const On={Head:ue.A,details:nn,Details:nn,code:function(e){return function(e){return void 0!==e.children&&a.Children.toArray(e.children).every((function(e){return"string"==typeof e&&!e.includes("\n")}))}(e)?(0,r.jsx)(Fe,Object.assign({},e)):(0,r.jsx)(We,Object.assign({},e))},a:function(e){return(0,r.jsx)(j.A,Object.assign({},e))},pre:function(e){return(0,r.jsx)(r.Fragment,{children:e.children})},ul:function(e){return(0,r.jsx)("ul",Object.assign({},e,{className:sn(e.className)}))},li:function(e){return(0,qe.A)().collectAnchor(e.id),(0,r.jsx)("li",Object.assign({},e))},img:function(e){return(0,r.jsx)("img",Object.assign({decoding:"async",loading:"lazy"},e,{className:(n=e.className,(0,u.A)(n,rn.img))}));var n},h1:function(e){return(0,r.jsx)(tn,Object.assign({as:"h1"},e))},h2:function(e){return(0,r.jsx)(tn,Object.assign({as:"h2"},e))},h3:function(e){return(0,r.jsx)(tn,Object.assign({as:"h3"},e))},h4:function(e){return(0,r.jsx)(tn,Object.assign({as:"h4"},e))},h5:function(e){return(0,r.jsx)(tn,Object.assign({as:"h5"},e))},h6:function(e){return(0,r.jsx)(tn,Object.assign({as:"h6"},e))},admonition:Tn,mermaid:function(){return null}};function En(e){var n=e.children;return(0,r.jsx)(de.x,{components:On,children:n})}function Hn(e){var n,t,a,s,i=e.children,o=(n=l(),t=n.metadata,a=n.frontMatter,s=n.contentTitle,a.hide_title||void 0!==s?null:t.title);return(0,r.jsxs)("div",{className:(0,u.A)(p.G.docs.docMarkdown,"markdown"),children:[o&&(0,r.jsx)("header",{children:(0,r.jsx)(le.A,{as:"h1",children:o})}),(0,r.jsx)(En,{children:i})]})}var Mn=t(71243);function In(){return(0,r.jsx)(g.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function Sn(){return(0,r.jsx)(g.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Un(){return(0,r.jsx)(ue.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Vn(){return(0,r.jsx)(g.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function Rn(){return(0,r.jsx)(g.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}function zn(e){var n=e.className;return(0,r.jsx)(Tn,{type:"caution",title:(0,r.jsx)(Vn,{}),className:(0,u.A)(n,p.G.common.draftBanner),children:(0,r.jsx)(Rn,{})})}function Pn(e){var n=e.className;return(0,r.jsx)(Tn,{type:"caution",title:(0,r.jsx)(In,{}),className:(0,u.A)(n,p.G.common.unlistedBanner),children:(0,r.jsx)(Sn,{})})}function Gn(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(Un,{}),(0,r.jsx)(Pn,Object.assign({},e))]})}function Dn(e){var n=e.metadata,t=n.unlisted,a=n.frontMatter;return(0,r.jsxs)(r.Fragment,{children:[(t||a.unlisted)&&(0,r.jsx)(Gn,{}),a.draft&&(0,r.jsx)(zn,{})]})}const Wn={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Fn(e){var n,t,a,s,i,o,c=e.children,d=(n=l(),t=n.frontMatter,a=n.toc,s=(0,m.l)(),i=t.hide_table_of_contents,o=!i&&a.length>0,{hidden:i,mobile:o?(0,r.jsx)(te,{}):void 0,desktop:!o||"desktop"!==s&&"ssr"!==s?void 0:(0,r.jsx)(ce,{})}),h=l().metadata;return(0,r.jsxs)("div",{className:"row",children:[(0,r.jsxs)("div",{className:(0,u.A)("col",!d.hidden&&Wn.docItemCol),children:[(0,r.jsx)(Dn,{metadata:h}),(0,r.jsx)(v.A,{}),(0,r.jsxs)("div",{className:Wn.docItemContainer,children:[(0,r.jsxs)("article",{children:[(0,r.jsx)(Mn.A,{}),(0,r.jsx)(b.A,{}),d.mobile,(0,r.jsx)(Hn,{children:c}),(0,r.jsx)(S,{})]}),(0,r.jsx)(f,{})]})]}),d.desktop&&(0,r.jsx)("div",{className:"col col--3",children:d.desktop})]})}function qn(e){var n="docs-doc-id-"+e.content.metadata.id,t=e.content;return(0,r.jsx)(c,{content:e.content,children:(0,r.jsxs)(s.e3,{className:n,children:[(0,r.jsx)(d,{}),(0,r.jsx)(Fn,{children:(0,r.jsx)(t,{})})]})})}},86929:(e,n,t)=>{"use strict";t.d(n,{A:()=>c});t(96540);var a=t(21312),s=t(34164),i=t(28774),r=t(74848);function o(e){var n=e.permalink,t=e.title,a=e.subLabel,o=e.isNext;return(0,r.jsxs)(i.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[a&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,r.jsx)("div",{className:"pagination-nav__label",children:t})]})}function c(e){var n=e.previous,t=e.next;return(0,r.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,a.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,r.jsx)(o,Object.assign({},n,{subLabel:(0,r.jsx)(a.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})})),t&&(0,r.jsx)(o,Object.assign({},t,{subLabel:(0,r.jsx)(a.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0}))]})}},4267:(e,n,t)=>{"use strict";t.d(n,{A:()=>c});t(96540);var a=t(34164),s=t(21312),i=t(17559),r=t(23025),o=t(74848);function c(e){var n=e.className,t=(0,r.r)();return t.badge?(0,o.jsx)("span",{className:(0,a.A)(n,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(s.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}},51878:(e,n,t)=>{"use strict";t.d(n,{A:()=>b});t(96540);var a=t(34164),s=t(44586),i=t(28774),r=t(21312),o=t(44070),c=t(17559),l=t(53886),d=t(23025),u=t(74848);var m={unreleased:function(e){var n=e.siteTitle,t=e.versionMetadata;return(0,u.jsx)(r.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){var n=e.siteTitle,t=e.versionMetadata;return(0,u.jsx)(r.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,u.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){var n=m[e.versionMetadata.banner];return(0,u.jsx)(n,Object.assign({},e))}function f(e){var n=e.versionLabel,t=e.to,a=e.onClick;return(0,u.jsx)(r.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:t,onClick:a,children:(0,u.jsx)(r.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function v(e){var n,t=e.className,i=e.versionMetadata,r=(0,s.A)().siteConfig.title,d=(0,o.vT)({failfast:!0}).pluginId,m=(0,l.g1)(d).savePreferredVersionName,v=(0,o.HW)(d),b=v.latestDocSuggestion,p=v.latestVersionSuggestion,g=null!=b?b:(n=p).docs.find((function(e){return e.id===n.mainDocId}));return(0,u.jsxs)("div",{className:(0,a.A)(t,c.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:r,versionMetadata:i})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(f,{versionLabel:p.label,to:g.path,onClick:function(){return m(p.name)}})})]})}function b(e){var n=e.className,t=(0,d.r)();return t.banner?(0,u.jsx)(v,{className:n,versionMetadata:t}):null}},18426:(e,n)=>{function t(e){let n,t=[];for(let a of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(a))t.push(parseInt(a,10));else if(n=a.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,a,s,i]=n;if(a&&i){a=parseInt(a),i=parseInt(i);const e=a{"use strict";t.d(n,{R:()=>r,x:()=>o});var a=t(96540);const s={},i=a.createContext(s);function r(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/18d58ddb.2fffe863.js b/assets/js/18d58ddb.2fffe863.js new file mode 100644 index 000000000..35067d4c0 --- /dev/null +++ b/assets/js/18d58ddb.2fffe863.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6439],{30922:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var n=s(74848),t=s(28453);const i={title:"Walk-through: Create Asana tasks and projects from Slack",sidebar_label:"Asana: create tasks and projects from Slack"},r=void 0,o={id:"walk-throughs/slack-asana",title:"Walk-through: Create Asana tasks and projects from Slack",description:"Connecting your Asana account with your Slack account can make for a powerful",source:"@site/docs-classic/walk-throughs/slack-asana.md",sourceDirName:"walk-throughs",slug:"/walk-throughs/slack-asana",permalink:"/walk-throughs/slack-asana",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/walk-throughs/slack-asana.md",tags:[],version:"current",frontMatter:{title:"Walk-through: Create Asana tasks and projects from Slack",sidebar_label:"Asana: create tasks and projects from Slack"},sidebar:"docs",previous:{title:"Slack: check for new channels",permalink:"/walk-throughs/slack-channel-check"},next:{title:"Trello: Create a new card from Slack",permalink:"/walk-throughs/slack-trello"}},c={},l=[{value:"Asana Configuration",id:"asana-configuration",level:2},{value:"Slack Configuration",id:"slack-configuration",level:2},{value:"Building In Darklang",id:"building-in-darklang",level:2},{value:"Looking Up Project & Workspace IDs",id:"looking-up-project--workspace-ids",level:3},{value:"Making input easier with modals",id:"making-input-easier-with-modals",level:3}];function d(e){const a={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"Connecting your Asana account with your Slack account can make for a powerful\ntool - no more switching tabs and hunting for the right Asana project when you\nwant to capture the excellent idea that just came up. In this tutorial, we'll\nshow you a few ways to enable your team to create new Asana tasks directly from\nSlack."}),"\n",(0,n.jsx)(a.h2,{id:"asana-configuration",children:"Asana Configuration"}),"\n",(0,n.jsx)(a.p,{children:"For this tutorial, you'll want to grab a couple different things from Asana and\nstore each of them as separate functions in Darklang:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["Your ",(0,n.jsx)(a.a,{href:"https://app.asana.com/0/developer-console",children:"personal access token"})]}),"\n",(0,n.jsx)(a.li,{children:"The id of one of your workspaces. The easiest way to access this is via the\nadmin panel - it will be the long number in the URL."}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"slack-configuration",children:"Slack Configuration"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:(0,n.jsx)(a.a,{href:"https://api.slack.com/apps",children:"Create a new app in Slack."})}),"\n",(0,n.jsxs)(a.li,{children:["Set a Slash command (the option should appear under ",(0,n.jsx)(a.strong,{children:"Add features &\nfunctionality"})," on your app's main page). Your Request URL should look\nsomething like\n",(0,n.jsx)(a.code,{children:"https://yourusername-yourcanvasname.builtwithdark.com/new-project"}),". This is\nthe URL that Slack will call when you use your slash command - don't add\nanything to your Darklang canvas just yet."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/slashcommand.png",src:s(93583).A+"",width:"1124",height:"836"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["Go to ",(0,n.jsx)(a.strong,{children:"Features -> OAuth & Permissions"})," and add the following scopes to\nyour app: ",(0,n.jsx)(a.code,{children:"chat:write"}),", ",(0,n.jsx)(a.code,{children:"chat:write.public"}),", ",(0,n.jsx)(a.code,{children:"commands."})]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/permissions.png",src:s(15197).A+"",width:"1346",height:"790"})}),"\n",(0,n.jsxs)(a.ol,{start:"4",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Install your app to the workspace (either via\xa0",(0,n.jsx)(a.strong,{children:"Settings -> Basic\nInformation"}),"\xa0or\xa0",(0,n.jsx)(a.strong,{children:"Settings -> Install App"}),"). Since this app is being built\nfor your workspace specifically, we will not need to set up full OAuth, like\nwe would if we wanted to distribute this more publicly."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Copy your bot user access token, which will now be available under\xa0",(0,n.jsx)(a.strong,{children:"Settings\n-> Install"}),"\xa0app and save it as a function in your Darklang canvas. Use this\nfunction wherever you see\xa0",(0,n.jsx)(a.code,{children:"slackToken"}),"\xa0in the code examples."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"building-in-darklang",children:"Building In Darklang"}),"\n",(0,n.jsx)(a.p,{children:"First, we're going to learn how to create new Asana projects using slash\ncommands."}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Go to Slack and try to use your new slash command. Make sure to include some\ntext after entering your command. You will see an error message appear."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newprojecterror.png",src:s(72036).A+"",width:"906",height:"146"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Navigate to your Darklang canvas and check the 404s section in the sidebar -\nyou should see an HTTP POST created called ",(0,n.jsx)(a.code,{children:"/new-project"})," (or whatever you\nused when setting up your slash command). Click the plus sign to add it to\nyour canvas."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newproject404.png",src:s(56818).A+"",width:"628",height:"124"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsx)(a.li,{children:"Once your handler is on your canvas, you can click on the trace (the white\ndot to the left) to see the incoming data Slack attempted to send."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/trace.png",src:s(24566).A+"",width:"768",height:"136"})}),"\n",(0,n.jsxs)(a.ol,{start:"4",children:["\n",(0,n.jsxs)(a.li,{children:["You will see a text field in the body of the trace data. Use\n",(0,n.jsx)(a.code,{children:"request.body.text"})," to set your project name."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/projectname.png",src:s(3547).A+"",width:"1694",height:"134"})}),"\n",(0,n.jsxs)(a.ol,{start:"5",children:["\n",(0,n.jsxs)(a.li,{children:["Using the\n",(0,n.jsx)(a.a,{href:"/reference/packages#createproject",children:(0,n.jsx)(a.code,{children:"Asana::createProject function"})})," and\nthe data we grabbed from the trace, we can now create a new project. You will\nneed to use the workspace id and personal access token you saved in the\nset-up process."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/createProject.png",src:s(12206).A+"",width:"1690",height:"166"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Try your Slash command again and then check Asana - your new project will be\nthere!"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/asanaproject.png",src:s(18836).A+"",width:"1096",height:"152"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsxs)(a.li,{children:["Now, let's try sending over a slash command with different data. Return to\nSlack and use your slash command again, but this time, write a project name,\n",(0,n.jsx)(a.code,{children:"\\"})," sign and a description and send it over (something like\n",(0,n.jsx)(a.code,{children:"\\asana-new-project Another New Project/Notes on the project"}),"). Return to\nDarklang and check the traces - you should see a text field formatted like\nthis:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/textexample.png",src:s(84436).A+"",width:"640",height:"72"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsxs)(a.li,{children:["Now, we can use the ",(0,n.jsx)(a.code,{children:"String::split"})," function to separate out our two pieces\nof information, and add them separately to the\n",(0,n.jsx)(a.a,{href:"/reference/packages#createProject",children:(0,n.jsx)(a.code,{children:"Asana::createProject function"})}),"\nfunction."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/notes.png",src:s(36462).A+"",width:"1344",height:"248"})}),"\n",(0,n.jsx)(a.h3,{id:"looking-up-project--workspace-ids",children:"Looking Up Project & Workspace IDs"}),"\n",(0,n.jsxs)(a.p,{children:["You're not always going to want to pre-define your workspace or projects via\nDarklang functions. This section will show you how to take a project name as a\n",(0,n.jsx)(a.code,{children:"String"})," and get the corresponding id. We'll be using projects for this example,\nbut it works the same way for workspaces."]}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Create a Projects datastore."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/projectsdatastore.png",src:s(92504).A+"",width:"768",height:"284"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Create a new REPL. First, use the\n",(0,n.jsx)(a.a,{href:"/reference/packages#getAllProjects",children:(0,n.jsx)(a.code,{children:"Asana::getAllProjects"})})," function to\ngrab information about all projects you have access to. Then, use a\n",(0,n.jsx)(a.code,{children:"List::map"})," to add their names and gids to the DB."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/populatedb.png",src:s(92093).A+"",width:"986",height:"400"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"To see this in action, create a fresh slash command and call it, using the\ntask name/project name formatting. To make it easier on yourself, make sure\nto use a project name that already exists."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Split out the information as you did before."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/taskandproject.png",src:s(97780).A+"",width:"864",height:"246"})}),"\n",(0,n.jsxs)(a.ol,{start:"5",children:["\n",(0,n.jsxs)(a.li,{children:["Create a new function called ",(0,n.jsx)(a.code,{children:"lookUpProjectID"})," and then use ",(0,n.jsx)(a.code,{children:"DB::queryOne"})," to\ngrab the id based on the ",(0,n.jsx)(a.code,{children:"projectName"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/lookupprojectid.png",src:s(93759).A+"",width:"1436",height:"360"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Use a match statement to handle both the success and failure (couldn't find\nthe project name in the db) case."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/match.png",src:s(74186).A+"",width:"1356",height:"418"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsx)(a.li,{children:"Use your new function your HTTP POST handler."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/lookupid.png",src:s(95944).A+"",width:"860",height:"288"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsx)(a.li,{children:"Call the slash command again and check Asana - a new task should be there."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newesttask.png",src:s(74568).A+"",width:"1154",height:"402"})}),"\n",(0,n.jsx)(a.h3,{id:"making-input-easier-with-modals",children:"Making input easier with modals"}),"\n",(0,n.jsx)(a.p,{children:"Okay, this is all great, but still has some problems. What if someone forgets to\nadd the right special character? Let's make it a little easier, by creating a\nmodal to handle their input."}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Create a new slash command."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newmodal.png",src:s(49148).A+"",width:"1160",height:"840"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Turn Interactivity on via ",(0,n.jsx)(a.strong,{children:"Features -> Interactivity and Shortcuts"})," and\nspecify a URL for the interaction to be sent to:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/interactivity.png",src:s(13684).A+"",width:"1344",height:"568"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Slack uses ",(0,n.jsx)(a.code,{children:"JSON"})," to generate modals via a framework called Block Kit, even\nproviding a\n",(0,n.jsx)(a.a,{href:"https://api.slack.com/tools/block-kit-builder",children:"handy Block Kit builder"}),". At\nthis point, it may make sense to pause and create your modal - we'll need the\n",(0,n.jsx)(a.code,{children:"JSON"})," soon. The modal we're going to use has 3 fields: a single line for the\ntask name, a multiline for the task description and a select for a list of\nprojects."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Call your new slash command and grab the 404, as you did in previous steps."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Start by setting your ",(0,n.jsx)(a.code,{children:"triggerId"})," using ",(0,n.jsx)(a.code,{children:"request.body.trigger_id"}),":"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/triggerid.png",src:s(11294).A+"",width:"748",height:"154"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Format your header - you will need the Slack token you grabbed earlier in the\nset-up process."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/header.png",src:s(46706).A+"",width:"1468",height:"200"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsxs)(a.li,{children:["Create an ",(0,n.jsx)(a.code,{children:"HttpClient::post"})," request and add your ",(0,n.jsx)(a.code,{children:"triggerID"})," and ",(0,n.jsx)(a.code,{children:"JSON"}),".\nThese are truncated screenshots with a lot of the JSON cut out:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/json1.png",src:s(68094).A+"",width:"1726",height:"1062"})}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/json2.png",src:s(53845).A+"",width:"1730",height:"524"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsx)(a.li,{children:"Try your new Slash command. A modal should appear. Fill in the modal and hit\nsubmit to get a new error message:"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/asanaerror.png",src:s(63785).A+"",width:"1010",height:"1088"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsxs)(a.li,{children:["Check your 404s and add your new handler. This is the handler where the\nbehind-the-scenes logic will happen. Start by formatting the payload into\n",(0,n.jsx)(a.code,{children:"JSON"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/payload.png",src:s(72771).A+"",width:"876",height:"158"})}),"\n",(0,n.jsxs)(a.ol,{start:"9",children:["\n",(0,n.jsx)(a.li,{children:"Now grab all of your important values from your modal fields:"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/payloaddata.png",src:s(39451).A+"",width:"1678",height:"198"})}),"\n",(0,n.jsxs)(a.ol,{start:"10",children:["\n",(0,n.jsxs)(a.li,{children:["Use the ",(0,n.jsx)(a.a,{href:"/reference/packages#createTask",children:(0,n.jsx)(a.code,{children:"Asana::createTask"})})," and the\n",(0,n.jsx)(a.code,{children:"lookUpProjectID"})," functions to create your new task."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/createtask.png",src:s(43978).A+"",width:"1672",height:"228"})}),"\n",(0,n.jsxs)(a.ol,{start:"11",children:["\n",(0,n.jsxs)(a.li,{children:["Respond with a ",(0,n.jsx)(a.code,{children:"200"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/200.png",src:s(14675).A+"",width:"1684",height:"394"})}),"\n",(0,n.jsxs)(a.ol,{start:"12",children:["\n",(0,n.jsx)(a.li,{children:"Check Asana - your new task should be visible in the project your specified\nproject."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/mytask.png",src:s(25424).A+"",width:"1124",height:"398"})}),"\n",(0,n.jsx)(a.p,{children:"Congratulations, you now have a Slack app that can create Asana projects and\ntasks in multiple ways!"})]})}function h(e={}){const{wrapper:a}={...(0,t.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},14675:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/200-c2e21851ec04e192c60b35e080fb355d.png"},63785:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/asanaerror-d2e5ba6ffa35907b4288b415c725da01.png"},18836:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/asanaproject-3d8880808761c9f3efa7ae02935b0a5c.png"},12206:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/createProject-ed7a0f10184bb9b39db9c6ada0a904c2.png"},43978:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/createtask-db0996b173954b3b87a4fb6feab7dc22.png"},46706:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/header-6ec1f3aef556e6e1997f158af7331975.png"},13684:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/interactivity-d4683a157498e2c98da915987ace63db.png"},68094:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/json1-c8bf5be987ea2c16038b48801ef870b0.png"},53845:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/json2-f22891d6d774d38877f3922ef1cfe4c8.png"},95944:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/lookupid-2e4b4fa07ead0a74755c07d268f39bd9.png"},93759:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/lookupprojectid-5dbc9bb458e81907e63ffb098dfba058.png"},74186:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/match-71f91127a161c7389cc8d6e8afd78b04.png"},25424:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/mytask-5352023a9f5811c843a812bb67830273.png"},74568:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/newesttask-c1f3188f719dc1071af5634842df2628.png"},49148:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/newmodal-336ee086bb89d306f94d2b87ac162c7c.png"},56818:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/newproject404-0654fe92ff262295b06f965b02859f2e.png"},72036:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/newprojecterror-8bc0b6086f68020dc22ca086faefefe0.png"},36462:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/notes-1ee65c91c6d65f3ed58b8440cad482bd.png"},72771:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/payload-58a0bd684bc1ee1f5912000d9ed3d815.png"},39451:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/payloaddata-eb6e41c26e0f8c131102be1399117df2.png"},15197:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/permissions-a2cf90c9411ff1a6f9e33e31c22e1985.png"},92093:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/populatedb-4c32fc0d6789847571a5f82b69b330e0.png"},3547:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/projectname-d887561e1e2527c3ad2181af97d8b2ac.png"},92504:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/projectsdatastore-d38adf697b223b5469f8ec4a550b2168.png"},93583:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/slashcommand-73a882da5959ddcf178423028b81abff.png"},97780:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/taskandproject-b2210ba9a279b40c19160f511cfea7ab.png"},84436:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/textexample-5dc93cf10c278036f06ce6968993638a.png"},24566:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/trace-7ae182da0cb1a28c00f13e7b5685ca0c.png"},11294:(e,a,s)=>{s.d(a,{A:()=>n});const n=s.p+"assets/images/triggerid-0d8e94dd955cbb88b4aaa3aa3245b1ff.png"},28453:(e,a,s)=>{s.d(a,{R:()=>r,x:()=>o});var n=s(96540);const t={},i=n.createContext(t);function r(e){const a=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/18d58ddb.c8965bfd.js b/assets/js/18d58ddb.c8965bfd.js deleted file mode 100644 index 2e64ee555..000000000 --- a/assets/js/18d58ddb.c8965bfd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7680],{9921:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var n=s(85893),t=s(11151);const i={title:"Walk-through: Create Asana tasks and projects from Slack",sidebar_label:"Asana: create tasks and projects from Slack"},r=void 0,o={id:"walk-throughs/slack-asana",title:"Walk-through: Create Asana tasks and projects from Slack",description:"Connecting your Asana account with your Slack account can make for a powerful",source:"@site/docs-classic/walk-throughs/slack-asana.md",sourceDirName:"walk-throughs",slug:"/walk-throughs/slack-asana",permalink:"/walk-throughs/slack-asana",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/walk-throughs/slack-asana.md",tags:[],version:"current",frontMatter:{title:"Walk-through: Create Asana tasks and projects from Slack",sidebar_label:"Asana: create tasks and projects from Slack"},sidebar:"docs",previous:{title:"Slack: check for new channels",permalink:"/walk-throughs/slack-channel-check"},next:{title:"Trello: Create a new card from Slack",permalink:"/walk-throughs/slack-trello"}},c={},l=[{value:"Asana Configuration",id:"asana-configuration",level:2},{value:"Slack Configuration",id:"slack-configuration",level:2},{value:"Building In Darklang",id:"building-in-darklang",level:2},{value:"Looking Up Project & Workspace IDs",id:"looking-up-project--workspace-ids",level:3},{value:"Making input easier with modals",id:"making-input-easier-with-modals",level:3}];function d(e){const a={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"Connecting your Asana account with your Slack account can make for a powerful\ntool - no more switching tabs and hunting for the right Asana project when you\nwant to capture the excellent idea that just came up. In this tutorial, we'll\nshow you a few ways to enable your team to create new Asana tasks directly from\nSlack."}),"\n",(0,n.jsx)(a.h2,{id:"asana-configuration",children:"Asana Configuration"}),"\n",(0,n.jsx)(a.p,{children:"For this tutorial, you'll want to grab a couple different things from Asana and\nstore each of them as separate functions in Darklang:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["Your ",(0,n.jsx)(a.a,{href:"https://app.asana.com/0/developer-console",children:"personal access token"})]}),"\n",(0,n.jsx)(a.li,{children:"The id of one of your workspaces. The easiest way to access this is via the\nadmin panel - it will be the long number in the URL."}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"slack-configuration",children:"Slack Configuration"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:(0,n.jsx)(a.a,{href:"https://api.slack.com/apps",children:"Create a new app in Slack."})}),"\n",(0,n.jsxs)(a.li,{children:["Set a Slash command (the option should appear under ",(0,n.jsx)(a.strong,{children:"Add features &\nfunctionality"})," on your app's main page). Your Request URL should look\nsomething like\n",(0,n.jsx)(a.code,{children:"https://yourusername-yourcanvasname.builtwithdark.com/new-project"}),". This is\nthe URL that Slack will call when you use your slash command - don't add\nanything to your Darklang canvas just yet."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/slashcommand.png",src:s(75174).Z+"",width:"1124",height:"836"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["Go to ",(0,n.jsx)(a.strong,{children:"Features -> OAuth & Permissions"})," and add the following scopes to\nyour app: ",(0,n.jsx)(a.code,{children:"chat:write"}),", ",(0,n.jsx)(a.code,{children:"chat:write.public"}),", ",(0,n.jsx)(a.code,{children:"commands."})]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/permissions.png",src:s(85268).Z+"",width:"1346",height:"790"})}),"\n",(0,n.jsxs)(a.ol,{start:"4",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Install your app to the workspace (either via\xa0",(0,n.jsx)(a.strong,{children:"Settings -> Basic\nInformation"}),"\xa0or\xa0",(0,n.jsx)(a.strong,{children:"Settings -> Install App"}),"). Since this app is being built\nfor your workspace specifically, we will not need to set up full OAuth, like\nwe would if we wanted to distribute this more publicly."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Copy your bot user access token, which will now be available under\xa0",(0,n.jsx)(a.strong,{children:"Settings\n-> Install"}),"\xa0app and save it as a function in your Darklang canvas. Use this\nfunction wherever you see\xa0",(0,n.jsx)(a.code,{children:"slackToken"}),"\xa0in the code examples."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"building-in-darklang",children:"Building In Darklang"}),"\n",(0,n.jsx)(a.p,{children:"First, we're going to learn how to create new Asana projects using slash\ncommands."}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Go to Slack and try to use your new slash command. Make sure to include some\ntext after entering your command. You will see an error message appear."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newprojecterror.png",src:s(4071).Z+"",width:"906",height:"146"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Navigate to your Darklang canvas and check the 404s section in the sidebar -\nyou should see an HTTP POST created called ",(0,n.jsx)(a.code,{children:"/new-project"})," (or whatever you\nused when setting up your slash command). Click the plus sign to add it to\nyour canvas."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newproject404.png",src:s(72258).Z+"",width:"628",height:"124"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsx)(a.li,{children:"Once your handler is on your canvas, you can click on the trace (the white\ndot to the left) to see the incoming data Slack attempted to send."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/trace.png",src:s(22879).Z+"",width:"768",height:"136"})}),"\n",(0,n.jsxs)(a.ol,{start:"4",children:["\n",(0,n.jsxs)(a.li,{children:["You will see a text field in the body of the trace data. Use\n",(0,n.jsx)(a.code,{children:"request.body.text"})," to set your project name."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/projectname.png",src:s(60183).Z+"",width:"1694",height:"134"})}),"\n",(0,n.jsxs)(a.ol,{start:"5",children:["\n",(0,n.jsxs)(a.li,{children:["Using the\n",(0,n.jsx)(a.a,{href:"/reference/packages#createproject",children:(0,n.jsx)(a.code,{children:"Asana::createProject function"})})," and\nthe data we grabbed from the trace, we can now create a new project. You will\nneed to use the workspace id and personal access token you saved in the\nset-up process."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/createProject.png",src:s(90854).Z+"",width:"1690",height:"166"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Try your Slash command again and then check Asana - your new project will be\nthere!"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/asanaproject.png",src:s(72033).Z+"",width:"1096",height:"152"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsxs)(a.li,{children:["Now, let's try sending over a slash command with different data. Return to\nSlack and use your slash command again, but this time, write a project name,\n",(0,n.jsx)(a.code,{children:"\\"})," sign and a description and send it over (something like\n",(0,n.jsx)(a.code,{children:"\\asana-new-project Another New Project/Notes on the project"}),"). Return to\nDarklang and check the traces - you should see a text field formatted like\nthis:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/textexample.png",src:s(59514).Z+"",width:"640",height:"72"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsxs)(a.li,{children:["Now, we can use the ",(0,n.jsx)(a.code,{children:"String::split"})," function to separate out our two pieces\nof information, and add them separately to the\n",(0,n.jsx)(a.a,{href:"/reference/packages#createProject",children:(0,n.jsx)(a.code,{children:"Asana::createProject function"})}),"\nfunction."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/notes.png",src:s(49004).Z+"",width:"1344",height:"248"})}),"\n",(0,n.jsx)(a.h3,{id:"looking-up-project--workspace-ids",children:"Looking Up Project & Workspace IDs"}),"\n",(0,n.jsxs)(a.p,{children:["You're not always going to want to pre-define your workspace or projects via\nDarklang functions. This section will show you how to take a project name as a\n",(0,n.jsx)(a.code,{children:"String"})," and get the corresponding id. We'll be using projects for this example,\nbut it works the same way for workspaces."]}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Create a Projects datastore."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/projectsdatastore.png",src:s(4650).Z+"",width:"768",height:"284"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Create a new REPL. First, use the\n",(0,n.jsx)(a.a,{href:"/reference/packages#getAllProjects",children:(0,n.jsx)(a.code,{children:"Asana::getAllProjects"})})," function to\ngrab information about all projects you have access to. Then, use a\n",(0,n.jsx)(a.code,{children:"List::map"})," to add their names and gids to the DB."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/populatedb.png",src:s(50017).Z+"",width:"986",height:"400"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"To see this in action, create a fresh slash command and call it, using the\ntask name/project name formatting. To make it easier on yourself, make sure\nto use a project name that already exists."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Split out the information as you did before."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/taskandproject.png",src:s(11926).Z+"",width:"864",height:"246"})}),"\n",(0,n.jsxs)(a.ol,{start:"5",children:["\n",(0,n.jsxs)(a.li,{children:["Create a new function called ",(0,n.jsx)(a.code,{children:"lookUpProjectID"})," and then use ",(0,n.jsx)(a.code,{children:"DB::queryOne"})," to\ngrab the id based on the ",(0,n.jsx)(a.code,{children:"projectName"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/lookupprojectid.png",src:s(90525).Z+"",width:"1436",height:"360"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Use a match statement to handle both the success and failure (couldn't find\nthe project name in the db) case."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/match.png",src:s(8099).Z+"",width:"1356",height:"418"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsx)(a.li,{children:"Use your new function your HTTP POST handler."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/lookupid.png",src:s(18021).Z+"",width:"860",height:"288"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsx)(a.li,{children:"Call the slash command again and check Asana - a new task should be there."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newesttask.png",src:s(86989).Z+"",width:"1154",height:"402"})}),"\n",(0,n.jsx)(a.h3,{id:"making-input-easier-with-modals",children:"Making input easier with modals"}),"\n",(0,n.jsx)(a.p,{children:"Okay, this is all great, but still has some problems. What if someone forgets to\nadd the right special character? Let's make it a little easier, by creating a\nmodal to handle their input."}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"Create a new slash command."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/newmodal.png",src:s(28927).Z+"",width:"1160",height:"840"})}),"\n",(0,n.jsxs)(a.ol,{start:"2",children:["\n",(0,n.jsxs)(a.li,{children:["Turn Interactivity on via ",(0,n.jsx)(a.strong,{children:"Features -> Interactivity and Shortcuts"})," and\nspecify a URL for the interaction to be sent to:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/interactivity.png",src:s(18434).Z+"",width:"1344",height:"568"})}),"\n",(0,n.jsxs)(a.ol,{start:"3",children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Slack uses ",(0,n.jsx)(a.code,{children:"JSON"})," to generate modals via a framework called Block Kit, even\nproviding a\n",(0,n.jsx)(a.a,{href:"https://api.slack.com/tools/block-kit-builder",children:"handy Block Kit builder"}),". At\nthis point, it may make sense to pause and create your modal - we'll need the\n",(0,n.jsx)(a.code,{children:"JSON"})," soon. The modal we're going to use has 3 fields: a single line for the\ntask name, a multiline for the task description and a select for a list of\nprojects."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Call your new slash command and grab the 404, as you did in previous steps."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Start by setting your ",(0,n.jsx)(a.code,{children:"triggerId"})," using ",(0,n.jsx)(a.code,{children:"request.body.trigger_id"}),":"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/triggerid.png",src:s(80736).Z+"",width:"748",height:"154"})}),"\n",(0,n.jsxs)(a.ol,{start:"6",children:["\n",(0,n.jsx)(a.li,{children:"Format your header - you will need the Slack token you grabbed earlier in the\nset-up process."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/header.png",src:s(19515).Z+"",width:"1468",height:"200"})}),"\n",(0,n.jsxs)(a.ol,{start:"7",children:["\n",(0,n.jsxs)(a.li,{children:["Create an ",(0,n.jsx)(a.code,{children:"HttpClient::post"})," request and add your ",(0,n.jsx)(a.code,{children:"triggerID"})," and ",(0,n.jsx)(a.code,{children:"JSON"}),".\nThese are truncated screenshots with a lot of the JSON cut out:"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/json1.png",src:s(98618).Z+"",width:"1726",height:"1062"})}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/json2.png",src:s(91484).Z+"",width:"1730",height:"524"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsx)(a.li,{children:"Try your new Slash command. A modal should appear. Fill in the modal and hit\nsubmit to get a new error message:"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/asanaerror.png",src:s(90795).Z+"",width:"1010",height:"1088"})}),"\n",(0,n.jsxs)(a.ol,{start:"8",children:["\n",(0,n.jsxs)(a.li,{children:["Check your 404s and add your new handler. This is the handler where the\nbehind-the-scenes logic will happen. Start by formatting the payload into\n",(0,n.jsx)(a.code,{children:"JSON"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/payload.png",src:s(79133).Z+"",width:"876",height:"158"})}),"\n",(0,n.jsxs)(a.ol,{start:"9",children:["\n",(0,n.jsx)(a.li,{children:"Now grab all of your important values from your modal fields:"}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/payloaddata.png",src:s(68011).Z+"",width:"1678",height:"198"})}),"\n",(0,n.jsxs)(a.ol,{start:"10",children:["\n",(0,n.jsxs)(a.li,{children:["Use the ",(0,n.jsx)(a.a,{href:"/reference/packages#createTask",children:(0,n.jsx)(a.code,{children:"Asana::createTask"})})," and the\n",(0,n.jsx)(a.code,{children:"lookUpProjectID"})," functions to create your new task."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/createtask.png",src:s(9850).Z+"",width:"1672",height:"228"})}),"\n",(0,n.jsxs)(a.ol,{start:"11",children:["\n",(0,n.jsxs)(a.li,{children:["Respond with a ",(0,n.jsx)(a.code,{children:"200"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/200.png",src:s(82671).Z+"",width:"1684",height:"394"})}),"\n",(0,n.jsxs)(a.ol,{start:"12",children:["\n",(0,n.jsx)(a.li,{children:"Check Asana - your new task should be visible in the project your specified\nproject."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"slack-apps/tutorials/asana-tutorial/mytask.png",src:s(43393).Z+"",width:"1124",height:"398"})}),"\n",(0,n.jsx)(a.p,{children:"Congratulations, you now have a Slack app that can create Asana projects and\ntasks in multiple ways!"})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},82671:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/200-c2e21851ec04e192c60b35e080fb355d.png"},90795:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/asanaerror-d2e5ba6ffa35907b4288b415c725da01.png"},72033:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/asanaproject-3d8880808761c9f3efa7ae02935b0a5c.png"},90854:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/createProject-ed7a0f10184bb9b39db9c6ada0a904c2.png"},9850:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/createtask-db0996b173954b3b87a4fb6feab7dc22.png"},19515:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/header-6ec1f3aef556e6e1997f158af7331975.png"},18434:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/interactivity-d4683a157498e2c98da915987ace63db.png"},98618:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/json1-c8bf5be987ea2c16038b48801ef870b0.png"},91484:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/json2-f22891d6d774d38877f3922ef1cfe4c8.png"},18021:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/lookupid-2e4b4fa07ead0a74755c07d268f39bd9.png"},90525:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/lookupprojectid-5dbc9bb458e81907e63ffb098dfba058.png"},8099:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/match-71f91127a161c7389cc8d6e8afd78b04.png"},43393:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/mytask-5352023a9f5811c843a812bb67830273.png"},86989:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/newesttask-c1f3188f719dc1071af5634842df2628.png"},28927:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/newmodal-336ee086bb89d306f94d2b87ac162c7c.png"},72258:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/newproject404-0654fe92ff262295b06f965b02859f2e.png"},4071:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/newprojecterror-8bc0b6086f68020dc22ca086faefefe0.png"},49004:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/notes-1ee65c91c6d65f3ed58b8440cad482bd.png"},79133:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/payload-58a0bd684bc1ee1f5912000d9ed3d815.png"},68011:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/payloaddata-eb6e41c26e0f8c131102be1399117df2.png"},85268:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/permissions-a2cf90c9411ff1a6f9e33e31c22e1985.png"},50017:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/populatedb-4c32fc0d6789847571a5f82b69b330e0.png"},60183:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/projectname-d887561e1e2527c3ad2181af97d8b2ac.png"},4650:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/projectsdatastore-d38adf697b223b5469f8ec4a550b2168.png"},75174:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/slashcommand-73a882da5959ddcf178423028b81abff.png"},11926:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/taskandproject-b2210ba9a279b40c19160f511cfea7ab.png"},59514:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/textexample-5dc93cf10c278036f06ce6968993638a.png"},22879:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/trace-7ae182da0cb1a28c00f13e7b5685ca0c.png"},80736:(e,a,s)=>{s.d(a,{Z:()=>n});const n=s.p+"assets/images/triggerid-0d8e94dd955cbb88b4aaa3aa3245b1ff.png"},11151:(e,a,s)=>{s.d(a,{Z:()=>o,a:()=>r});var n=s(67294);const t={},i=n.createContext(t);function r(e){const a=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/198abb01.03a23b02.js b/assets/js/198abb01.03a23b02.js new file mode 100644 index 000000000..86c8a9e8e --- /dev/null +++ b/assets/js/198abb01.03a23b02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9393],{82591:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>d});var i=s(74848),t=s(28453);const a={id:"structured-editing",title:"Structured Editing"},r=void 0,l={id:"discussion/structured-editing",title:"Structured Editing",description:"_Note: for now, Darklang is only supported for Chrome with browser extensions",source:"@site/docs-classic/discussion/structured-editing.md",sourceDirName:"discussion",slug:"/discussion/structured-editing",permalink:"/discussion/structured-editing",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/discussion/structured-editing.md",tags:[],version:"current",frontMatter:{id:"structured-editing",title:"Structured Editing"},sidebar:"docs",previous:{title:"Trace Driven Development",permalink:"/discussion/trace-driven-development"},next:{title:"Error Handling",permalink:"/discussion/error-handling"}},o={},d=[{value:"Blanks",id:"blanks",level:2},{value:"Types of Expressions",id:"types-of-expressions",level:2},{value:"Nesting Expressions",id:"nesting-expressions",level:2},{value:"Let Expressions",id:"let-expressions",level:3},{value:"Conditional Expressions",id:"conditional-expressions",level:3},{value:"Match Expressions",id:"match-expressions",level:3},{value:"Pipelines",id:"pipelines",level:3},{value:"Partials (Partially Completed Expressions)",id:"partials-partially-completed-expressions",level:2},{value:"Comments",id:"comments",level:2},{value:"Refactoring and editing code",id:"refactoring-and-editing-code",level:2},{value:"Undo/redo",id:"undoredo",level:3},{value:"Copy/paste",id:"copypaste",level:3},{value:"Command Palette",id:"command-palette",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"Note: for now, Darklang is only supported for Chrome with browser extensions\ndisabled."})}),"\n",(0,i.jsx)(n.p,{children:"At heart, Darklang is an expression-oriented programming language. This aspect\nof Darklang enables powerful features like live values and trace-driven\ndevelopment. This section introduces a simple way to think about the structure\nof Darklang programs within the editor."}),"\n",(0,i.jsx)(n.p,{children:"When writing code in Darklang, you are building up expressions, relying heavily\non autocomplete."}),"\n",(0,i.jsx)(n.h2,{id:"blanks",children:"Blanks"}),"\n",(0,i.jsxs)(n.p,{children:["A blank expression acts as a placeholder where you can type to create a\ndifferent expression. The value of a blank expression is ",(0,i.jsx)(n.code,{children:"Incomplete"}),", because\nit needs to be completed in order to be useful."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Blank Example",src:s(45770).A+"",width:"1018",height:"236"})}),"\n",(0,i.jsx)(n.p,{children:"Once a blank is filled in, it won't be a blank anymore:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Filled Blank Example",src:s(66695).A+"",width:"860",height:"206"})}),"\n",(0,i.jsx)(n.p,{children:"2 is an integer expression with the value 2."}),"\n",(0,i.jsx)(n.h2,{id:"types-of-expressions",children:"Types of Expressions"}),"\n",(0,i.jsx)(n.p,{children:"In addition to blanks, there are also many other types of expressions."}),"\n",(0,i.jsx)(n.p,{children:"Atomic Expressions include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Integers (whole numbers like ",(0,i.jsx)(n.code,{children:"42"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["Floats (numbers like ",(0,i.jsx)(n.code,{children:"1.5"}),")"]}),"\n",(0,i.jsx)(n.li,{children:"Strings (text in double quotes)"}),"\n",(0,i.jsx)(n.li,{children:"Bools (true and false)"}),"\n",(0,i.jsx)(n.li,{children:"null"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are also more complex expressions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Lists"}),"\n",(0,i.jsx)(n.li,{children:"Dicts"}),"\n",(0,i.jsx)(n.li,{children:"Records"}),"\n",(0,i.jsx)(n.li,{children:"Functions"}),"\n",(0,i.jsx)(n.li,{children:"Conditionals"}),"\n",(0,i.jsx)(n.li,{children:"Matches"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["For more on the language features of each type of expression, visit the\n",(0,i.jsx)(n.a,{href:"languageoverview",children:"Language Overview"}),". Examples of how these expressions are\nused in the editor are below."]}),"\n",(0,i.jsx)(n.h2,{id:"nesting-expressions",children:"Nesting Expressions"}),"\n",(0,i.jsx)(n.p,{children:"Expressions in Darklang are nested. For example, a multiplication expression is\na compound expression with two sub-expressions as operands:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Diagram",src:s(1483).A+"",width:"1629",height:"119"})}),"\n",(0,i.jsx)(n.p,{children:"Filling a blank with an expression with sub-parts introduces a new blank for\neach of them."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Diagram",src:s(10421).A+"",width:"848",height:"204"})}),"\n",(0,i.jsx)(n.p,{children:"In the expression 2 * 3, these sub-expressions are filled with the expressions\n2 and 3:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Expression",src:s(60364).A+"",width:"261",height:"119"})}),"\n",(0,i.jsxs)(n.p,{children:["The value of the expression ",(0,i.jsx)(n.code,{children:"2 * 3"})," is ",(0,i.jsx)(n.code,{children:"6"}),". This is equivalent to saying ",(0,i.jsx)(n.code,{children:"2 * 3"}),"\nevaluates to ",(0,i.jsx)(n.code,{children:"6"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Result",src:s(67357).A+"",width:"806",height:"194"})}),"\n",(0,i.jsxs)(n.p,{children:["Since ",(0,i.jsx)(n.code,{children:"2 * 3"})," is an expression, it can itself be a subexpression of a compound\nexpression. Consider the expression ",(0,i.jsx)(n.code,{children:"1 + 2 * 3"}),", which has the value ",(0,i.jsx)(n.code,{children:"7"}),". It is\na compound expression with a binary operator ",(0,i.jsx)(n.code,{children:"+"})," and two subexpressions as\noperands: ",(0,i.jsx)(n.code,{children:"1"})," and ",(0,i.jsx)(n.code,{children:"2 * 3"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"let-expressions",children:"Let Expressions"}),"\n",(0,i.jsx)(n.p,{children:"This nesting of expressions applies to all parts of the language, not just to\nmathematical expressions. When defining a variable in Darklang, you use a let\nexpression, which has 3 parts: a variable name, a value (an expression!) bound\nto that variable, and a body (another expression!) within which you can use the\nname as an expression to stand in for the value:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Let Diagram",src:s(90142).A+"",width:"1357",height:"267"})}),"\n",(0,i.jsx)(n.p,{children:"Here's a let with 3 blanks in Darklang:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Blanks in Let",src:s(34891).A+"",width:"1026",height:"266"})}),"\n",(0,i.jsx)(n.h3,{id:"conditional-expressions",children:"Conditional Expressions"}),"\n",(0,i.jsx)(n.p,{children:"If expressions have 3 parts: a boolean conditional expression and two branches,\na then and else expression. The value of the conditional expression determines\nwhether the then or else expression is evaluated. The value of the evaluated\nbranch becomes the value of the if expression as a whole."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"If Diagram",src:s(86060).A+"",width:"1261",height:"646"})}),"\n",(0,i.jsxs)(n.p,{children:["Here's a conditional in Darklang:\n",(0,i.jsx)(n.img,{alt:"If Example",src:s(61193).A+"",width:"1384",height:"394"})]}),"\n",(0,i.jsx)(n.h3,{id:"match-expressions",children:"Match Expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"match"})," expressions provide conditional evaluation of one or more expression\nbranches. They may also introduce new variable bindings. Every match has a\nsingle value expression that is evaluated once and matched against one or more\npatterns. The first pattern that matches the evaluated value indicates the\nexpression to evaluate. The value of the evaluated expression becomes the value\nof the match as a whole."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Match Diagram",src:s(17506).A+"",width:"1174",height:"535"})}),"\n",(0,i.jsx)(n.h3,{id:"pipelines",children:"Pipelines"}),"\n",(0,i.jsx)(n.p,{children:"Pipelines are a key part of the Darklang language. They allow you to create a\nchain of expressions, where each chain is an input to the next expression in the\nsequence."}),"\n",(0,i.jsxs)(n.p,{children:["To start one, select the code that has the result that you want to pipe, and hit\n",(0,i.jsx)(n.code,{children:"shift-enter"})," or type ",(0,i.jsx)(n.code,{children:"|>"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"img/refactoring/Screen_Recording_2020-01-07_at_01.56_PM.gif",src:s(52586).A+"",width:"920",height:"394"})}),"\n",(0,i.jsx)(n.h2,{id:"partials-partially-completed-expressions",children:"Partials (Partially Completed Expressions)"}),"\n",(0,i.jsx)(n.p,{children:"While you are typing or deleting, you'll often see partially completed\nexpressions like this:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(72663).A+"",width:"1336",height:"424"})}),"\n",(0,i.jsx)(n.p,{children:"The text in red is the partial, and the gray text behind it indicates what was\nthere before. Note that partials evaluate to whatever was there before:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(92276).A+"",width:"1296",height:"250"})}),"\n",(0,i.jsx)(n.p,{children:"...until you complete them from the autocomplete:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(80985).A+"",width:"912",height:"292"})}),"\n",(0,i.jsx)(n.h2,{id:"comments",children:"Comments"}),"\n",(0,i.jsxs)(n.p,{children:["To add comments to your Darklang code, start a line with ",(0,i.jsx)(n.code,{children:"let _ ="})," and add a\nstring containing the comment you'd like to include."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Option Example",src:s(13561).A+"",width:"824",height:"184"})}),"\n",(0,i.jsx)(n.h2,{id:"refactoring-and-editing-code",children:"Refactoring and editing code"}),"\n",(0,i.jsx)(n.h3,{id:"undoredo",children:"Undo/redo"}),"\n",(0,i.jsxs)(n.p,{children:["Darklang supports unlimited undo/redo in a single element. Undo with\n",(0,i.jsx)(n.code,{children:"Ctrl-Z"}),"/",(0,i.jsx)(n.code,{children:"Cmd-Z"})," and redo with ",(0,i.jsx)(n.code,{children:"Ctrl-Shift-Z"}),"/",(0,i.jsx)(n.code,{children:"Cmd-Shift-Z"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"copypaste",children:"Copy/paste"}),"\n",(0,i.jsx)(n.p,{children:"You can copy/paste selections, which is often used for refactoring."}),"\n",(0,i.jsx)(n.p,{children:"It may be helpful to note that copy/paste only works in Darklang between\nhandlers at this time. Copying JSON from an external source will paste into your\nhandlers in Darklang, but if you write code in the Darklang language in your\ntext editor of choice, that code will not paste. We hope to improve this\nexperience in the future."}),"\n",(0,i.jsx)(n.h3,{id:"command-palette",children:"Command Palette"}),"\n",(0,i.jsxs)(n.p,{children:["If you\u2019re looking to do something that is not immediately available, chances are\nit\u2019s in the command palette (accessed by hitting ",(0,i.jsx)(n.code,{children:"alt-x"})," on a US keyboard or\n",(0,i.jsx)(n.code,{children:"ctrl-\\"})," or ",(0,i.jsx)(n.code,{children:"ctrl-s"})," on other keyboards)."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"img/refactoring/Screen_Shot_2020-01-07_at_1.40.42_PM.png",src:s(59520).A+"",width:"822",height:"596"})}),"\n",(0,i.jsx)(n.p,{children:"This includes the common refactoring tools:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Extract a function or variable for re-use"}),"\n",(0,i.jsx)(n.li,{children:"Create a type"}),"\n",(0,i.jsx)(n.li,{children:"Wrap the current expression in a let (insert let here)"}),"\n",(0,i.jsx)(n.li,{children:"Insert a let-expression above this one"}),"\n",(0,i.jsx)(n.li,{children:"Wrap an expression in an if, if-then, or if-else"}),"\n"]}),"\n",(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/A39iZCaqX-w",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},13561:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/comment-e0b66e9bdb22600469ecdf9146417945.png"},59520:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/Screen_Shot_2020-01-07_at_1.40.42_PM-ea077b64e0010616dad54b6d0b1a0f59.png"},45770:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/blank_example-f5bc88f25f4048730993eab5c2fe1df3.png"},34891:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/blanks_in_let_example-5461770187ee37ec3fe2ed4dbf5ffc15.png"},66695:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/filled_blank_example-67b00ba99ccaf8a3e2f4a94ccae28fe2.png"},86060:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/if_diagram-d7011fef8575a8f7010cfdf208188d28.png"},61193:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/if_example-7fd9df71f9247946ff93674b1e87c783.png"},90142:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/let_diagram-4d5fa6896f733a54bc67694d9805b466.png"},17506:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/match_diagram-50ea4822f8f2053fa3a22101b8c5cffc.png"},1483:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/mul_diagram-829036b2b1ecce739def395b8850f0d5.png"},60364:(e,n,s)=>{s.d(n,{A:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQUAAAB3CAYAAAAKC1XvAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAF6VJREFUeJzt3Xl4FEX6wPFvTW4gmnDLTQC5BOQUUBCVUyQiKHgBHiA+64G3rLAaFFGWVfmtyrooIgZBBGRxdzGAqIALC8oRIKIQJCBJSMKVhNyZ6d8fnSyT0D05pmd6eqY+z5Nn2amemtcw/dJdXfWWoGqhwBDgdqAn0BxoAoRV472SJJmnCMgAUoF9wHrge6DY1ZuEi7YI4HFgJlDfkBAlSTLbWeBN4D2gUOsAvaRwIxAPtPRMXJIkmewkcD+wvXKDVlKYDrwLhDi9lgt8DWwAjgGZQKnhYUqSZKRgoDHQHrgVGAlEOrUXA08Ai111Mh1QnH7ygXlAlPHxSpLkZdGotw4FVDzPH9F7wyDUgYnyA08BfTwepiRJ3tYDSOHSuV4M3FT5oAjgd6eDTgDNvBaiJEne1gx1XMH5nA93PmAmFW8ZrvVygJIkeV8vKt5KPF/eEAacc2p4w4zoJEkyxXwunftnUeclMcrpxRzkoKIkBZJo1KeL5TlghA11pmK5BOCCCYFJkmSO86jnfblYGxXHDzZ4Nx5JknyA83nf00bFpwy/eTkYSZLMd9zpz81sqIubymV6ORhJksx32unPV9koG20s43L1lCRJfsn5vA8N9vanKwdfb4Jib0zFZBQ4hKMEG5l0icsQAsXscHyVoihiDjQJgcb2iutwAklxEGTOEiLDmx8qoMIXsx0GjysoSXHtKRUTEcrtKFxL4P4FV1YCHEDhK0TQKtHjT7+aHZDZ5ilKJwUmKhALdEdd0COp35V9wHoFVv1JiGMG9x+DutAR8GBSUJLimmInDoWHkX+5VbEjWIYj+GVx7exUs4PxtjhFaREMrwKTgSCz4/FxJcASAXEGXkF4PikoB14dgOL4Emjqbl8B5hyICaLHK1vMDsRb5inKIAesBRqZHYvFnLHBnS8JsdWAviokBZsBHVagJM4Zg+L4DpkQaqM+KF8r++MmmB2IN8xVlIkO+BaZEGqjoQM2vqYotxndsaFJQdkb1wWhLEfWb3RHCIJlyv64fmYH4kmvKkpv4GPkraU7wgSsfFVRuhnZqWFJQfkuLpgg1qJwhVF9BrBwBJ8rR//ql8k1TlHCbeotQx2zY/ED9WzweZyiGJZcjbtSqC+mAZ0M609qS8H5P5gdhCeEqCXAWpsdhx/pEgQPGtWZIUlBURCgvGBEX5ITRXlBUeIMH/cx0xeKEqTAs2bH4W+EWhPFEMZ84Q7E9QTaGNKX5Kwp+20DzA7CSEfgeipOrZeMEfOqovQwoiOD/hUSI4zpR7qMcIw0OwSDye+KhwSp1ZrdZlBSUNoa0490GZvfXYHJ74qHKAZdrRt1vyrnJHiKQnOzQzCY/K54jiHfFaOSQl2D+pEu52+/W3/77/Elhvxu/WpkW5Ik98mkIElSBQExxbSk1E7OxSKyLxZRancQEmwjKjKcqMhwhHC18bYUKHJOnSJt3z7OJSeTe/o0hRfU+sVBYWGERUYS1bo1DTt2pFmvXoRFRlbRm7X5ZVLY90s6W3YdZ9ueE/xy/AwpaRcoKbVfdly9OqF0atuQPl2aceugDtxyXQx1wmW5h0CgKAond+zgwMqVHPn3vzmfklKt9wWFhNCyf3+6jh9PzylTCI/yvx0R/CYpXMwv5sO1e/jwy70c/i2r2u/5KSmNn5LS+GD1T0RFhvPInb156v7+XNXQv/81CFQOu50DK1awfcECMg4erPH77SUlpGzfTsr27Wx66SX6Tp/OkFmzqNOggQeiNYflxxQcDoXFa/bQYcxfeeYvG6udELRcyC3kz0v/Q6fY91i4/L/YHQ4DI5XMlrJtG4t692bN5Mm1SgiVleTns+Odd3i7fXv2L19uQIS+wdJJIfNcHrc9sYLpr/2T02cuGtZvTl4RTy9IYPRjK7iQW2hYv5I5SouK+PrZZ1kyZAinExMN77/wwgXWTJrEuqlTcdgvv021GsvePuz5OY3Rj68g46xxyaCyjTuSuenhT/j+4we4sl541W+QfM7FjAyWx8ZyavfuKo+1BQUR1aYNUa1aEVG/PvbiYnLT08lJTSU3Pb3K9+9ZsoTi3FwmrFyJsFn331tLJoUtu37jjqdXkZtX5PK4enVCGdSrNV3bNaJNsygiwkMIDrJx5kI+J9Oz2fpTCgeOZuBw6BdV3v/raW6f8TnfLJ5McJB1/6IDkb24mI8GD+bMkSO6x9iCg+kUG0vPSZNoe9NNhF95peZxZ379lYNffMH++HjOHj2q29/BL76gYadO3DJnjtvxm8WQGo1KYtwW4GajgnJl18FT3DLtU/IK9LeouK5bC56bMpDbb+pISLDrOqBHT55l7uJtxP8rEcVFwfW5j9/MrGmDaxu2O3aLHnHXmfHBnjBXUXYBXqsqlbhiBWsmTULRGB9qP3w4o956iybXXFPt/hylpex6/302zpxJaaH2raWw2Zi+cyct+nm9eNa3s4W4pRbv82yNRk8qLrFz78y1ugmhXp1QPp5zOzvjH+bOYV2qTAgAHVo1YNncO1j9lwnUjdDfiuLVv28lJU3uvWs1Pe69l1vffrvCa3UaNOD+9et5YOPGGiUEUK8sBsyYwYPffKM7X0FxONjw9NO1jtlslkoKoSFBbHj/Prq2a3xZW9vm0ez+bBoPju1ZqwlJ44d2Yc1bE7DZtN9bXGJn/sc/1LhfyXwDZsxg8Ey1BkmTbt14dPduOsXGutVn6+uvZ/wnn+i2n9yxg9Qff3TrM8xiqaQA0LFNQ3Z9NpV7b71Uq7JT24Zs/+RBOse4VxR45PXteeGB63Xb4/91gPzCErc+w8dMAs7p/NxqYlyGGzZvHmPee4/pO3ZQPybGkD67jBtHl3HjdNut+pjSckkBoG5EKJ+9MZ73/ngrMS2i2fi3STRvbEy92BcevJ4r6mrXS80rKGbjjmRDPseHROv8WP/ZmhMhBNc99hih9eoZ2u+g55/XbTvxgzWvLC2ZFMo9dnc/Dv/jcVpdpT1iXBvRV0Qwbmhn3fbte08a9lk+oKCWbVKZlv37U6+pdomIzJ9/9nI0xrB0UgB1nMFoN/fTLw6U+Otp3TYLcjUzS87aqqam3btrvl5aWEhJfr6Xo3Gf5ZOCJ2gNZJZLzcz1YiQeJ5OCAeo2bKjfaMFVuDIpaGgQFaHb5mfTnl39x8jbh2rSm9ocUqcOIRH63yVfJZOChvBQ/YmeFkz8rsgrBQNcPK19S9m4a1cvR2IMmRQ05LiYPh0V6VdrIFxdDcikUA0Ou530/fs122KGDPFuMAaRSUHD2Qv650qDK/1q+0N5peCm37ZsoTA7W7Ptmrvu8nI0xpBJQcPPLmoyXNNefxDSguSYgpu2//nPmq+3GTSI5n37ejkaY8ikoOFQcqZuW7cOPpkUarvBit6JbwdKvRyL5exdupRjW7Zc9rqw2Ri5YIEJERlDJgUNm3ce0227ycUcBpP0Ql3ZmgS8SM02W9EbPKnpVUJzYAbwA+pqu1Y1fL/lHNmwga/+oL0p+A3PPUeL66y7sFUmhUpOpmfrXim0a1mfLm6ur/CA8WX/2wV4EziFenI+AlRVaFLv9qE64wlRwGTgn0AKsBB181gBjK3G+y3JXlzM1nnz+GzsWM2l053GjGHY66+bEJlxLFlkxZOWrt+n23bnsC5ejKTaKq/ICUI9Oa8H/g/4BvgUWA9UXnNuL3ut8ppxvaQQDgwD7kJNRnqjruOBv1Yjdss4nZjI4fXr2bdsGed+0y450m3CBMZ/+im2YGufVtaO3mAlpXY+XLtXsy3IZuPRu/p4OaIqdQE6uWgPB24r+zkP/As1QXwLlFcdKeTypOB8+2ADBqKuqLwbqM7KsxuAq4Cqa5j5kMykJL51qphUkp9PTloaOamp5GXqjzOF1q3L0LlzGTBjhl/sIyKTgpO/r95DamaOZlvskI60aeZzNf7HV33I/0SjntiTUG8xvgRWoyaFyid6IdC17NjJqCd4TdiAWODvNXyfqX7ftYtDq1dX+/iwyEh6TpnC4Bdf5IoWLTwYmXfJpFAm+2Ihcz74XrMtyGbjtcdv8m5A1VPbe/cWwJNlP1q6AYdq2Xe5O7BYUjjzyy/VOi48Kooe993HoOefJ6p1aw9H5X1yoLHMc29t4swF7RVtU8f1crlIykTDgQlAPOrtgdnOol59TAHuMTmWGss8fLhaxxVeuMCu99/nrbZtebd7d7a+8QYXMzI8HJ33yKSAWsp9yTrtsYRG0XV99SoBLp2Ek4FGQB9gDrCHigV5PelnYD7qAGRT1CT1Kb6RpGqkulcK5RRFIePgQTa/9BJvxcSwaeZMSy6Vrizgbx+yzufx8Ctf6VZyXjRrNI2i63o3qNqxoyaDPUAc0Ab1SmIoMAowquRQPrADddDyS+B3g/o1laIotBs2jJibKxYlL87LozA7m5zUVDIPHcJeol2OryQ/n23z53NozRruW7eOJt26aR5nBQGdFOwOB/e8uFZ3cHHiiGt89TFkdaQAi8t+IlAfUY5BHYeo6eSi48Bm1ESwCf1JT5YlhCB20SKXx5QUFHBq9272fPQRh1avprTo8l/DuWPH+HDQIKYkJNCyf39PhetRAX37MPvdb9myS/uZ89WtG7D4lTFejshjClDnK8wAWgPXoj6BqMph1EeeMcB01IlKfpcQqiskIoK2N97InfHxzDh8mFYDB2oeV5idzfLY2GrvZO1rAjYpfJ5wiPlLtQtr1o0IZe3bE3ULuPqBEahPIKrSGfUKQ6okum1bpm7bplvNOS8ri3UPPYTiaochHxWQSWHrTylMmb1OcxxBCFgyJ9bfVkM6GwLUZB7u+6jrK6RKbEFB3BUfr1uj8bfvviNpzRovR+W+gEsKh3/LYtwzqygu0S6h9foTtzBxRM12DbKQZsDnaI8lFaJd1j0c+AJ1rYNUSUidOi7XOmx94w0vRmOMgEoKJ9OzGfWHzziXrb0I8KGxPfnjw4O8HJXXhKAmhCY67TNRHy1qaYc6FyKgvi/VdfXo0TTs2FGzLX3fPrJq+KjTbAHzl3wqI4chD3/CiXTt/SDvuLkzH/zpNi9H5VULAL2M9y3wLuqjzJ90jrkNNXFIlQghaDd0qG578saNXozGfQGRFLLO5zH80XiOp2rPpxkxsD0r54+v1oa0FjUR9cmDlmzgIdQFUiWosxH1Vkm+hjpIKVWi9yQCID0x0YuRuM/vk8KF3EJGPLqcwzol1oYNaMc/Ft5NmIsKzhbXEXWugp4ngRNO//9n4GWdY23ACtSJUZKTSJ1dogCyf7fW/C6/Tgo5eUUMnx7Pvl+0V/De0LMV696ZSHiY3yaEeqizDvWWO69HnZJc2VvAVp331Ecdm/Db57W1UadBA922ohztyXG+ym+TQn5hCWOeWMGPSama7QOvbcnXi+6nbkTlUgJ+ZQlqzQUtWagTkrQ4gAcBvW/zdcBf3AvNvygOh25bUEiIFyNxn18mhfzCEmKfXMm2PSc02/t3b0HCovupV8evE8LTqIuT9DwKuFradxx41kX746jjDxKQf+6cblt4dLQXI3Gf3yWFvIJibnt8he705X7XNOfrRfcT6b+zFQEGoNZr1LME9baiKh9VcdzfUKdMB7wsFztMX9mypRcjcZ9fJYW8gmLGPLGS7348rtl+Y582bF482d92eaqsCepyar3LoBTgmRr05+qKIgJ1YtOVNejPLx3fqjcEAy0stv+D3ySF7IuFDJser5sQRg+6mq8X3efP6xnKOQC9Z2AO4AH0xwq0ZAGPuWj/Ce/VbvBJhdnZHE1I0G1vM3iwF6Nxn18khfLHjjsTtR/93DOqG+sWTiQizFoDPrWUhTrR6CkuX9H4NvpPFVxZizqj0VlB2WfcS82SjClO7tzpsb7/++67FOflaba1GjCA+u3aeeyzPcHySeF8TgHDp8ez66D2SuBH7+rD8nnj/HlikhYFtbx7by7VWnQ1/6A6ngBOlv05CehX9hk+zWG3k/DccyweOJBNM42fkHnmyBGX6xv6TJtm+Gd6mqUf0Geey2PY9E85cET7lvfFh27gjSdv8Yuy27WUhDrouBBYhHv7Q5bPfCyf7uzzdRUKzp9n1d13k7xpEwDb5s8nJy2NsYsXExzu/rhSXlYWy2NjdUuwNercmWsnT3b7c7zNslcKGWcvcsu0ZS4TwpszhgZyQih3EZgKaBehrJktqI86fT4hZCYl8UG/fv9LCOX2x8fzfs+epGzf7lb/pxMTWTxwIGd+/VWzXQjB6IULsQVZ7wrVkknh9JmL3Dx1meb2bkLAwhdG8uYM/QUqkv9L/OwzziYna7Zl/fILHw0ezLJRo0jetAmHXXsZvZacU6fY8Mwz/K1vX93+Qd1Psv3w4TWO2xdY7vahuMTOoAc/Jvmk9mSRqxpG8p/9v/Of/Z6db77whZE0a1TVVo2SWYa+/jq56ens/eQT3WOOJiRwNCGByGbN6DBiBK1vuIHGXboQ2awZYZGROEpKKDh/nvPHj5OemMixzZs5/v33VSaRzmPHMtTC+0laLikUFZfqJgSAtKxcVm9K8mgMQsCyuX67h6pfEEJwx5IlRF51VZWFTnLT0ti7dCl7ly51+3M7jx3L3atWWW5qszNL3j6YrWXTKwPl8aalCZuNYfPmMXHVKuo28uxu4bagIIa+9hr3rl1LUKi1p8/LpFALV7fWXxEn+Z5uEyYw4/Bh+kyb5pF/wVv068cjO3YwZPZshM36p5T1/wtMIJOC9dRp0ICxixfzdHIyA596ypArh1YDBzJx1Sqm79xJi379DIjSN1huTMEXdGglk4JVRbVqxa3vvMPIBQtI3ryZowkJHN+6lYyDB10ufwYIDg+nee/edBg1ik5jxuhWcbY6yyWFyLphKIlxZochWZwtOJirR43i6lGjACgtKuJccjLnjh2jKDf3f9OWI6KjCbviChq0b09UmzaWnHdQU5ZLCpLkCcFhYTTu2pXGXbuaHYrp5JiCJEkVyKQgSVIFRiUF7c0UJCPoz9SyJvld8RBh0HfFmKSgoF0uWXKfIM3sEAwmvyseomDMd8WgKwWhvVRMMoA4YnYERhIgvyseooAh3xVjkoIj6CtD+pEuJ2z+9rv9p9kB+Ktg+LcR/RiSFESv2SfQ34NQqi3Bz6Lbnw6bHYaRZglxCLDWjqvWsPuPQqQY0ZFxTx8ErxjWl6RShDvl03yWQH5XjCbcK7VXgWFJQXSP24DCZqP6k/iB7q9UZ28Gy3lJLUG/w+w4/MjGWUIYtrW1sfMUwkLvAY4Z2mcgEqQD9wjhn6XThRCKgDsFaFfblWriRCkYWgjS0KQgOr90FhiLQY9GAlQm2MaIHnF+fcLMEiLdrn5XLq+pJ1VXqgNGxwlh6O/Q8BmNokfcIez0BXYZ3XcA2EswfUX3l/eYHYg3vCzEHtRS8fvNjsVqFNgpoO/LQhheZswj05xFr7g0ujMQISagblMmuXYGIWYSzADRNe5k1Yf7j9lCnGgE/YS6A7ac2FQFAacETO8Ig2YJ4ZHfl6Dill/tAO2dWWtJSYoLpYQhCG4HegItUPc7tHbNqtorQd2b8RSCRBDriYj+VnR40ufLpntanKKEB8HNAm4HugtooajflUCtfVcMZChwyqaW6F9fAlvjhCg2+HNiqDQWqDj9xBj8YZIk+b4YnPKAXCUpSVIFNtRLlHKBekkvSYHM+bwvtgGnnV5o6uVgJEkyXzOnP6fZqDji29bLwUiSZD7n8z7dBuxzemGUl4ORJMl8zuf9PoCRXBp5zAGiTAhKkiRzRAO5XMoBwwHCUMs4lb/4plnRSZLkdQu4dO6fwWnQ8QWnhgLUSUaSJPm33qjne/m5/5xzYwRw0qnxJBVHJCVJ8i/Ngd+5dM6nAOGVD7oBKHI66BTQ12shSpLkLdeiJoHyc70YGKJ38CNUnPZcAMxHHYyQJMna6qOOITjfMijAVOeDhMYbpwHvUXGW00UgAfgaOIq6oKfU8JAlSTJSMOqCsqtRHzuOAOo5tRcDjwEfOb9JKykADAbigVaGhylJki9IASYBP1Ru0FsQtQ3oiDoaedZjYUmS5G1ngGeATmgkBNC/UnAWCtwIxAK9UEctm6LOb5AkyXcVoa5tSqWsHgOwFbWmh67/B0zUzRw09u4NAAAAAElFTkSuQmCC"},67357:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/mul_result-6e197c548f91d0d0e5071fc108183a42.png"},10421:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/multiplication-0cc3f3878fc0c97e1c79a0b0ba8a837c.png"},92276:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/partial_almost_filled-4b762452f9bb256886378c0f5607ed2a.png"},80985:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/partial_completed_example-c38ede5668459128fd92ddac7054e655.png"},72663:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/partial_example-780a8525a6ae741813cd3ec025b173fc.png"},52586:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/pipeline_example-2666efd85b8185b116c40ff07b002685.png"},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var i=s(96540);const t={},a=i.createContext(t);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/198abb01.187dee61.js b/assets/js/198abb01.187dee61.js deleted file mode 100644 index 60cc27183..000000000 --- a/assets/js/198abb01.187dee61.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5009],{60168:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>d});var i=s(85893),t=s(11151);const a={id:"structured-editing",title:"Structured Editing"},r=void 0,l={id:"discussion/structured-editing",title:"Structured Editing",description:"_Note: for now, Darklang is only supported for Chrome with browser extensions",source:"@site/docs-classic/discussion/structured-editing.md",sourceDirName:"discussion",slug:"/discussion/structured-editing",permalink:"/discussion/structured-editing",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/discussion/structured-editing.md",tags:[],version:"current",frontMatter:{id:"structured-editing",title:"Structured Editing"},sidebar:"docs",previous:{title:"Trace Driven Development",permalink:"/discussion/trace-driven-development"},next:{title:"Error Handling",permalink:"/discussion/error-handling"}},o={},d=[{value:"Blanks",id:"blanks",level:2},{value:"Types of Expressions",id:"types-of-expressions",level:2},{value:"Nesting Expressions",id:"nesting-expressions",level:2},{value:"Let Expressions",id:"let-expressions",level:3},{value:"Conditional Expressions",id:"conditional-expressions",level:3},{value:"Match Expressions",id:"match-expressions",level:3},{value:"Pipelines",id:"pipelines",level:3},{value:"Partials (Partially Completed Expressions)",id:"partials-partially-completed-expressions",level:2},{value:"Comments",id:"comments",level:2},{value:"Refactoring and editing code",id:"refactoring-and-editing-code",level:2},{value:"Undo/redo",id:"undoredo",level:3},{value:"Copy/paste",id:"copypaste",level:3},{value:"Command Palette",id:"command-palette",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"Note: for now, Darklang is only supported for Chrome with browser extensions\ndisabled."})}),"\n",(0,i.jsx)(n.p,{children:"At heart, Darklang is an expression-oriented programming language. This aspect\nof Darklang enables powerful features like live values and trace-driven\ndevelopment. This section introduces a simple way to think about the structure\nof Darklang programs within the editor."}),"\n",(0,i.jsx)(n.p,{children:"When writing code in Darklang, you are building up expressions, relying heavily\non autocomplete."}),"\n",(0,i.jsx)(n.h2,{id:"blanks",children:"Blanks"}),"\n",(0,i.jsxs)(n.p,{children:["A blank expression acts as a placeholder where you can type to create a\ndifferent expression. The value of a blank expression is ",(0,i.jsx)(n.code,{children:"Incomplete"}),", because\nit needs to be completed in order to be useful."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Blank Example",src:s(63705).Z+"",width:"1018",height:"236"})}),"\n",(0,i.jsx)(n.p,{children:"Once a blank is filled in, it won't be a blank anymore:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Filled Blank Example",src:s(59298).Z+"",width:"860",height:"206"})}),"\n",(0,i.jsx)(n.p,{children:"2 is an integer expression with the value 2."}),"\n",(0,i.jsx)(n.h2,{id:"types-of-expressions",children:"Types of Expressions"}),"\n",(0,i.jsx)(n.p,{children:"In addition to blanks, there are also many other types of expressions."}),"\n",(0,i.jsx)(n.p,{children:"Atomic Expressions include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Integers (whole numbers like ",(0,i.jsx)(n.code,{children:"42"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["Floats (numbers like ",(0,i.jsx)(n.code,{children:"1.5"}),")"]}),"\n",(0,i.jsx)(n.li,{children:"Strings (text in double quotes)"}),"\n",(0,i.jsx)(n.li,{children:"Bools (true and false)"}),"\n",(0,i.jsx)(n.li,{children:"null"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are also more complex expressions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Lists"}),"\n",(0,i.jsx)(n.li,{children:"Dicts"}),"\n",(0,i.jsx)(n.li,{children:"Records"}),"\n",(0,i.jsx)(n.li,{children:"Functions"}),"\n",(0,i.jsx)(n.li,{children:"Conditionals"}),"\n",(0,i.jsx)(n.li,{children:"Matches"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["For more on the language features of each type of expression, visit the\n",(0,i.jsx)(n.a,{href:"languageoverview",children:"Language Overview"}),". Examples of how these expressions are\nused in the editor are below."]}),"\n",(0,i.jsx)(n.h2,{id:"nesting-expressions",children:"Nesting Expressions"}),"\n",(0,i.jsx)(n.p,{children:"Expressions in Darklang are nested. For example, a multiplication expression is\na compound expression with two sub-expressions as operands:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Diagram",src:s(17705).Z+"",width:"1629",height:"119"})}),"\n",(0,i.jsx)(n.p,{children:"Filling a blank with an expression with sub-parts introduces a new blank for\neach of them."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Diagram",src:s(31021).Z+"",width:"848",height:"204"})}),"\n",(0,i.jsx)(n.p,{children:"In the expression 2 * 3, these sub-expressions are filled with the expressions\n2 and 3:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Expression",src:s(45177).Z+"",width:"261",height:"119"})}),"\n",(0,i.jsxs)(n.p,{children:["The value of the expression ",(0,i.jsx)(n.code,{children:"2 * 3"})," is ",(0,i.jsx)(n.code,{children:"6"}),". This is equivalent to saying ",(0,i.jsx)(n.code,{children:"2 * 3"}),"\nevaluates to ",(0,i.jsx)(n.code,{children:"6"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Multiplication Result",src:s(87915).Z+"",width:"806",height:"194"})}),"\n",(0,i.jsxs)(n.p,{children:["Since ",(0,i.jsx)(n.code,{children:"2 * 3"})," is an expression, it can itself be a subexpression of a compound\nexpression. Consider the expression ",(0,i.jsx)(n.code,{children:"1 + 2 * 3"}),", which has the value ",(0,i.jsx)(n.code,{children:"7"}),". It is\na compound expression with a binary operator ",(0,i.jsx)(n.code,{children:"+"})," and two subexpressions as\noperands: ",(0,i.jsx)(n.code,{children:"1"})," and ",(0,i.jsx)(n.code,{children:"2 * 3"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"let-expressions",children:"Let Expressions"}),"\n",(0,i.jsx)(n.p,{children:"This nesting of expressions applies to all parts of the language, not just to\nmathematical expressions. When defining a variable in Darklang, you use a let\nexpression, which has 3 parts: a variable name, a value (an expression!) bound\nto that variable, and a body (another expression!) within which you can use the\nname as an expression to stand in for the value:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Let Diagram",src:s(16647).Z+"",width:"1357",height:"267"})}),"\n",(0,i.jsx)(n.p,{children:"Here's a let with 3 blanks in Darklang:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Blanks in Let",src:s(8e3).Z+"",width:"1026",height:"266"})}),"\n",(0,i.jsx)(n.h3,{id:"conditional-expressions",children:"Conditional Expressions"}),"\n",(0,i.jsx)(n.p,{children:"If expressions have 3 parts: a boolean conditional expression and two branches,\na then and else expression. The value of the conditional expression determines\nwhether the then or else expression is evaluated. The value of the evaluated\nbranch becomes the value of the if expression as a whole."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"If Diagram",src:s(88808).Z+"",width:"1261",height:"646"})}),"\n",(0,i.jsxs)(n.p,{children:["Here's a conditional in Darklang:\n",(0,i.jsx)(n.img,{alt:"If Example",src:s(67634).Z+"",width:"1384",height:"394"})]}),"\n",(0,i.jsx)(n.h3,{id:"match-expressions",children:"Match Expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"match"})," expressions provide conditional evaluation of one or more expression\nbranches. They may also introduce new variable bindings. Every match has a\nsingle value expression that is evaluated once and matched against one or more\npatterns. The first pattern that matches the evaluated value indicates the\nexpression to evaluate. The value of the evaluated expression becomes the value\nof the match as a whole."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Match Diagram",src:s(35948).Z+"",width:"1174",height:"535"})}),"\n",(0,i.jsx)(n.h3,{id:"pipelines",children:"Pipelines"}),"\n",(0,i.jsx)(n.p,{children:"Pipelines are a key part of the Darklang language. They allow you to create a\nchain of expressions, where each chain is an input to the next expression in the\nsequence."}),"\n",(0,i.jsxs)(n.p,{children:["To start one, select the code that has the result that you want to pipe, and hit\n",(0,i.jsx)(n.code,{children:"shift-enter"})," or type ",(0,i.jsx)(n.code,{children:"|>"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"img/refactoring/Screen_Recording_2020-01-07_at_01.56_PM.gif",src:s(16391).Z+"",width:"920",height:"394"})}),"\n",(0,i.jsx)(n.h2,{id:"partials-partially-completed-expressions",children:"Partials (Partially Completed Expressions)"}),"\n",(0,i.jsx)(n.p,{children:"While you are typing or deleting, you'll often see partially completed\nexpressions like this:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(7101).Z+"",width:"1336",height:"424"})}),"\n",(0,i.jsx)(n.p,{children:"The text in red is the partial, and the gray text behind it indicates what was\nthere before. Note that partials evaluate to whatever was there before:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(21885).Z+"",width:"1296",height:"250"})}),"\n",(0,i.jsx)(n.p,{children:"...until you complete them from the autocomplete:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Partial",src:s(36058).Z+"",width:"912",height:"292"})}),"\n",(0,i.jsx)(n.h2,{id:"comments",children:"Comments"}),"\n",(0,i.jsxs)(n.p,{children:["To add comments to your Darklang code, start a line with ",(0,i.jsx)(n.code,{children:"let _ ="})," and add a\nstring containing the comment you'd like to include."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Option Example",src:s(6464).Z+"",width:"824",height:"184"})}),"\n",(0,i.jsx)(n.h2,{id:"refactoring-and-editing-code",children:"Refactoring and editing code"}),"\n",(0,i.jsx)(n.h3,{id:"undoredo",children:"Undo/redo"}),"\n",(0,i.jsxs)(n.p,{children:["Darklang supports unlimited undo/redo in a single element. Undo with\n",(0,i.jsx)(n.code,{children:"Ctrl-Z"}),"/",(0,i.jsx)(n.code,{children:"Cmd-Z"})," and redo with ",(0,i.jsx)(n.code,{children:"Ctrl-Shift-Z"}),"/",(0,i.jsx)(n.code,{children:"Cmd-Shift-Z"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"copypaste",children:"Copy/paste"}),"\n",(0,i.jsx)(n.p,{children:"You can copy/paste selections, which is often used for refactoring."}),"\n",(0,i.jsx)(n.p,{children:"It may be helpful to note that copy/paste only works in Darklang between\nhandlers at this time. Copying JSON from an external source will paste into your\nhandlers in Darklang, but if you write code in the Darklang language in your\ntext editor of choice, that code will not paste. We hope to improve this\nexperience in the future."}),"\n",(0,i.jsx)(n.h3,{id:"command-palette",children:"Command Palette"}),"\n",(0,i.jsxs)(n.p,{children:["If you\u2019re looking to do something that is not immediately available, chances are\nit\u2019s in the command palette (accessed by hitting ",(0,i.jsx)(n.code,{children:"alt-x"})," on a US keyboard or\n",(0,i.jsx)(n.code,{children:"ctrl-\\"})," or ",(0,i.jsx)(n.code,{children:"ctrl-s"})," on other keyboards)."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"img/refactoring/Screen_Shot_2020-01-07_at_1.40.42_PM.png",src:s(90686).Z+"",width:"822",height:"596"})}),"\n",(0,i.jsx)(n.p,{children:"This includes the common refactoring tools:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Extract a function or variable for re-use"}),"\n",(0,i.jsx)(n.li,{children:"Create a type"}),"\n",(0,i.jsx)(n.li,{children:"Wrap the current expression in a let (insert let here)"}),"\n",(0,i.jsx)(n.li,{children:"Insert a let-expression above this one"}),"\n",(0,i.jsx)(n.li,{children:"Wrap an expression in an if, if-then, or if-else"}),"\n"]}),"\n",(0,i.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/A39iZCaqX-w",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},6464:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/comment-e0b66e9bdb22600469ecdf9146417945.png"},90686:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/Screen_Shot_2020-01-07_at_1.40.42_PM-ea077b64e0010616dad54b6d0b1a0f59.png"},63705:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/blank_example-f5bc88f25f4048730993eab5c2fe1df3.png"},8e3:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/blanks_in_let_example-5461770187ee37ec3fe2ed4dbf5ffc15.png"},59298:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/filled_blank_example-67b00ba99ccaf8a3e2f4a94ccae28fe2.png"},88808:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/if_diagram-d7011fef8575a8f7010cfdf208188d28.png"},67634:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/if_example-7fd9df71f9247946ff93674b1e87c783.png"},16647:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/let_diagram-4d5fa6896f733a54bc67694d9805b466.png"},35948:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/match_diagram-50ea4822f8f2053fa3a22101b8c5cffc.png"},17705:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/mul_diagram-829036b2b1ecce739def395b8850f0d5.png"},45177:(e,n,s)=>{s.d(n,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQUAAAB3CAYAAAAKC1XvAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAF6VJREFUeJzt3Xl4FEX6wPFvTW4gmnDLTQC5BOQUUBCVUyQiKHgBHiA+64G3rLAaFFGWVfmtyrooIgZBBGRxdzGAqIALC8oRIKIQJCBJSMKVhNyZ6d8fnSyT0D05pmd6eqY+z5Nn2amemtcw/dJdXfWWoGqhwBDgdqAn0BxoAoRV472SJJmnCMgAUoF9wHrge6DY1ZuEi7YI4HFgJlDfkBAlSTLbWeBN4D2gUOsAvaRwIxAPtPRMXJIkmewkcD+wvXKDVlKYDrwLhDi9lgt8DWwAjgGZQKnhYUqSZKRgoDHQHrgVGAlEOrUXA08Ai111Mh1QnH7ygXlAlPHxSpLkZdGotw4FVDzPH9F7wyDUgYnyA08BfTwepiRJ3tYDSOHSuV4M3FT5oAjgd6eDTgDNvBaiJEne1gx1XMH5nA93PmAmFW8ZrvVygJIkeV8vKt5KPF/eEAacc2p4w4zoJEkyxXwunftnUeclMcrpxRzkoKIkBZJo1KeL5TlghA11pmK5BOCCCYFJkmSO86jnfblYGxXHDzZ4Nx5JknyA83nf00bFpwy/eTkYSZLMd9zpz81sqIubymV6ORhJksx32unPV9koG20s43L1lCRJfsn5vA8N9vanKwdfb4Jib0zFZBQ4hKMEG5l0icsQAsXscHyVoihiDjQJgcb2iutwAklxEGTOEiLDmx8qoMIXsx0GjysoSXHtKRUTEcrtKFxL4P4FV1YCHEDhK0TQKtHjT7+aHZDZ5ilKJwUmKhALdEdd0COp35V9wHoFVv1JiGMG9x+DutAR8GBSUJLimmInDoWHkX+5VbEjWIYj+GVx7exUs4PxtjhFaREMrwKTgSCz4/FxJcASAXEGXkF4PikoB14dgOL4Emjqbl8B5hyICaLHK1vMDsRb5inKIAesBRqZHYvFnLHBnS8JsdWAviokBZsBHVagJM4Zg+L4DpkQaqM+KF8r++MmmB2IN8xVlIkO+BaZEGqjoQM2vqYotxndsaFJQdkb1wWhLEfWb3RHCIJlyv64fmYH4kmvKkpv4GPkraU7wgSsfFVRuhnZqWFJQfkuLpgg1qJwhVF9BrBwBJ8rR//ql8k1TlHCbeotQx2zY/ED9WzweZyiGJZcjbtSqC+mAZ0M609qS8H5P5gdhCeEqCXAWpsdhx/pEgQPGtWZIUlBURCgvGBEX5ITRXlBUeIMH/cx0xeKEqTAs2bH4W+EWhPFEMZ84Q7E9QTaGNKX5Kwp+20DzA7CSEfgeipOrZeMEfOqovQwoiOD/hUSI4zpR7qMcIw0OwSDye+KhwSp1ZrdZlBSUNoa0490GZvfXYHJ74qHKAZdrRt1vyrnJHiKQnOzQzCY/K54jiHfFaOSQl2D+pEu52+/W3/77/Elhvxu/WpkW5Ik98mkIElSBQExxbSk1E7OxSKyLxZRancQEmwjKjKcqMhwhHC18bYUKHJOnSJt3z7OJSeTe/o0hRfU+sVBYWGERUYS1bo1DTt2pFmvXoRFRlbRm7X5ZVLY90s6W3YdZ9ueE/xy/AwpaRcoKbVfdly9OqF0atuQPl2aceugDtxyXQx1wmW5h0CgKAond+zgwMqVHPn3vzmfklKt9wWFhNCyf3+6jh9PzylTCI/yvx0R/CYpXMwv5sO1e/jwy70c/i2r2u/5KSmNn5LS+GD1T0RFhvPInb156v7+XNXQv/81CFQOu50DK1awfcECMg4erPH77SUlpGzfTsr27Wx66SX6Tp/OkFmzqNOggQeiNYflxxQcDoXFa/bQYcxfeeYvG6udELRcyC3kz0v/Q6fY91i4/L/YHQ4DI5XMlrJtG4t692bN5Mm1SgiVleTns+Odd3i7fXv2L19uQIS+wdJJIfNcHrc9sYLpr/2T02cuGtZvTl4RTy9IYPRjK7iQW2hYv5I5SouK+PrZZ1kyZAinExMN77/wwgXWTJrEuqlTcdgvv021GsvePuz5OY3Rj68g46xxyaCyjTuSuenhT/j+4we4sl541W+QfM7FjAyWx8ZyavfuKo+1BQUR1aYNUa1aEVG/PvbiYnLT08lJTSU3Pb3K9+9ZsoTi3FwmrFyJsFn331tLJoUtu37jjqdXkZtX5PK4enVCGdSrNV3bNaJNsygiwkMIDrJx5kI+J9Oz2fpTCgeOZuBw6BdV3v/raW6f8TnfLJ5McJB1/6IDkb24mI8GD+bMkSO6x9iCg+kUG0vPSZNoe9NNhF95peZxZ379lYNffMH++HjOHj2q29/BL76gYadO3DJnjtvxm8WQGo1KYtwW4GajgnJl18FT3DLtU/IK9LeouK5bC56bMpDbb+pISLDrOqBHT55l7uJtxP8rEcVFwfW5j9/MrGmDaxu2O3aLHnHXmfHBnjBXUXYBXqsqlbhiBWsmTULRGB9qP3w4o956iybXXFPt/hylpex6/302zpxJaaH2raWw2Zi+cyct+nm9eNa3s4W4pRbv82yNRk8qLrFz78y1ugmhXp1QPp5zOzvjH+bOYV2qTAgAHVo1YNncO1j9lwnUjdDfiuLVv28lJU3uvWs1Pe69l1vffrvCa3UaNOD+9et5YOPGGiUEUK8sBsyYwYPffKM7X0FxONjw9NO1jtlslkoKoSFBbHj/Prq2a3xZW9vm0ez+bBoPju1ZqwlJ44d2Yc1bE7DZtN9bXGJn/sc/1LhfyXwDZsxg8Ey1BkmTbt14dPduOsXGutVn6+uvZ/wnn+i2n9yxg9Qff3TrM8xiqaQA0LFNQ3Z9NpV7b71Uq7JT24Zs/+RBOse4VxR45PXteeGB63Xb4/91gPzCErc+w8dMAs7p/NxqYlyGGzZvHmPee4/pO3ZQPybGkD67jBtHl3HjdNut+pjSckkBoG5EKJ+9MZ73/ngrMS2i2fi3STRvbEy92BcevJ4r6mrXS80rKGbjjmRDPseHROv8WP/ZmhMhBNc99hih9eoZ2u+g55/XbTvxgzWvLC2ZFMo9dnc/Dv/jcVpdpT1iXBvRV0Qwbmhn3fbte08a9lk+oKCWbVKZlv37U6+pdomIzJ9/9nI0xrB0UgB1nMFoN/fTLw6U+Otp3TYLcjUzS87aqqam3btrvl5aWEhJfr6Xo3Gf5ZOCJ2gNZJZLzcz1YiQeJ5OCAeo2bKjfaMFVuDIpaGgQFaHb5mfTnl39x8jbh2rSm9ocUqcOIRH63yVfJZOChvBQ/YmeFkz8rsgrBQNcPK19S9m4a1cvR2IMmRQ05LiYPh0V6VdrIFxdDcikUA0Ou530/fs122KGDPFuMAaRSUHD2Qv650qDK/1q+0N5peCm37ZsoTA7W7Ptmrvu8nI0xpBJQcPPLmoyXNNefxDSguSYgpu2//nPmq+3GTSI5n37ejkaY8ikoOFQcqZuW7cOPpkUarvBit6JbwdKvRyL5exdupRjW7Zc9rqw2Ri5YIEJERlDJgUNm3ce0227ycUcBpP0Ql3ZmgS8SM02W9EbPKnpVUJzYAbwA+pqu1Y1fL/lHNmwga/+oL0p+A3PPUeL66y7sFUmhUpOpmfrXim0a1mfLm6ur/CA8WX/2wV4EziFenI+AlRVaFLv9qE64wlRwGTgn0AKsBB181gBjK3G+y3JXlzM1nnz+GzsWM2l053GjGHY66+bEJlxLFlkxZOWrt+n23bnsC5ejKTaKq/ICUI9Oa8H/g/4BvgUWA9UXnNuL3ut8ppxvaQQDgwD7kJNRnqjruOBv1Yjdss4nZjI4fXr2bdsGed+0y450m3CBMZ/+im2YGufVtaO3mAlpXY+XLtXsy3IZuPRu/p4OaIqdQE6uWgPB24r+zkP/As1QXwLlFcdKeTypOB8+2ADBqKuqLwbqM7KsxuAq4Cqa5j5kMykJL51qphUkp9PTloaOamp5GXqjzOF1q3L0LlzGTBjhl/sIyKTgpO/r95DamaOZlvskI60aeZzNf7HV33I/0SjntiTUG8xvgRWoyaFyid6IdC17NjJqCd4TdiAWODvNXyfqX7ftYtDq1dX+/iwyEh6TpnC4Bdf5IoWLTwYmXfJpFAm+2Ihcz74XrMtyGbjtcdv8m5A1VPbe/cWwJNlP1q6AYdq2Xe5O7BYUjjzyy/VOi48Kooe993HoOefJ6p1aw9H5X1yoLHMc29t4swF7RVtU8f1crlIykTDgQlAPOrtgdnOol59TAHuMTmWGss8fLhaxxVeuMCu99/nrbZtebd7d7a+8QYXMzI8HJ33yKSAWsp9yTrtsYRG0XV99SoBLp2Ek4FGQB9gDrCHigV5PelnYD7qAGRT1CT1Kb6RpGqkulcK5RRFIePgQTa/9BJvxcSwaeZMSy6Vrizgbx+yzufx8Ctf6VZyXjRrNI2i63o3qNqxoyaDPUAc0Ab1SmIoMAowquRQPrADddDyS+B3g/o1laIotBs2jJibKxYlL87LozA7m5zUVDIPHcJeol2OryQ/n23z53NozRruW7eOJt26aR5nBQGdFOwOB/e8uFZ3cHHiiGt89TFkdaQAi8t+IlAfUY5BHYeo6eSi48Bm1ESwCf1JT5YlhCB20SKXx5QUFHBq9272fPQRh1avprTo8l/DuWPH+HDQIKYkJNCyf39PhetRAX37MPvdb9myS/uZ89WtG7D4lTFejshjClDnK8wAWgPXoj6BqMph1EeeMcB01IlKfpcQqiskIoK2N97InfHxzDh8mFYDB2oeV5idzfLY2GrvZO1rAjYpfJ5wiPlLtQtr1o0IZe3bE3ULuPqBEahPIKrSGfUKQ6okum1bpm7bplvNOS8ri3UPPYTiaochHxWQSWHrTylMmb1OcxxBCFgyJ9bfVkM6GwLUZB7u+6jrK6RKbEFB3BUfr1uj8bfvviNpzRovR+W+gEsKh3/LYtwzqygu0S6h9foTtzBxRM12DbKQZsDnaI8lFaJd1j0c+AJ1rYNUSUidOi7XOmx94w0vRmOMgEoKJ9OzGfWHzziXrb0I8KGxPfnjw4O8HJXXhKAmhCY67TNRHy1qaYc6FyKgvi/VdfXo0TTs2FGzLX3fPrJq+KjTbAHzl3wqI4chD3/CiXTt/SDvuLkzH/zpNi9H5VULAL2M9y3wLuqjzJ90jrkNNXFIlQghaDd0qG578saNXozGfQGRFLLO5zH80XiOp2rPpxkxsD0r54+v1oa0FjUR9cmDlmzgIdQFUiWosxH1Vkm+hjpIKVWi9yQCID0x0YuRuM/vk8KF3EJGPLqcwzol1oYNaMc/Ft5NmIsKzhbXEXWugp4ngRNO//9n4GWdY23ACtSJUZKTSJ1dogCyf7fW/C6/Tgo5eUUMnx7Pvl+0V/De0LMV696ZSHiY3yaEeqizDvWWO69HnZJc2VvAVp331Ecdm/Db57W1UadBA922ohztyXG+ym+TQn5hCWOeWMGPSama7QOvbcnXi+6nbkTlUgJ+ZQlqzQUtWagTkrQ4gAcBvW/zdcBf3AvNvygOh25bUEiIFyNxn18mhfzCEmKfXMm2PSc02/t3b0HCovupV8evE8LTqIuT9DwKuFradxx41kX746jjDxKQf+6cblt4dLQXI3Gf3yWFvIJibnt8he705X7XNOfrRfcT6b+zFQEGoNZr1LME9baiKh9VcdzfUKdMB7wsFztMX9mypRcjcZ9fJYW8gmLGPLGS7348rtl+Y582bF482d92eaqsCepyar3LoBTgmRr05+qKIgJ1YtOVNejPLx3fqjcEAy0stv+D3ySF7IuFDJser5sQRg+6mq8X3efP6xnKOQC9Z2AO4AH0xwq0ZAGPuWj/Ce/VbvBJhdnZHE1I0G1vM3iwF6Nxn18khfLHjjsTtR/93DOqG+sWTiQizFoDPrWUhTrR6CkuX9H4NvpPFVxZizqj0VlB2WfcS82SjClO7tzpsb7/++67FOflaba1GjCA+u3aeeyzPcHySeF8TgHDp8ez66D2SuBH7+rD8nnj/HlikhYFtbx7by7VWnQ1/6A6ngBOlv05CehX9hk+zWG3k/DccyweOJBNM42fkHnmyBGX6xv6TJtm+Gd6mqUf0Geey2PY9E85cET7lvfFh27gjSdv8Yuy27WUhDrouBBYhHv7Q5bPfCyf7uzzdRUKzp9n1d13k7xpEwDb5s8nJy2NsYsXExzu/rhSXlYWy2NjdUuwNercmWsnT3b7c7zNslcKGWcvcsu0ZS4TwpszhgZyQih3EZgKaBehrJktqI86fT4hZCYl8UG/fv9LCOX2x8fzfs+epGzf7lb/pxMTWTxwIGd+/VWzXQjB6IULsQVZ7wrVkknh9JmL3Dx1meb2bkLAwhdG8uYM/QUqkv9L/OwzziYna7Zl/fILHw0ezLJRo0jetAmHXXsZvZacU6fY8Mwz/K1vX93+Qd1Psv3w4TWO2xdY7vahuMTOoAc/Jvmk9mSRqxpG8p/9v/Of/Z6db77whZE0a1TVVo2SWYa+/jq56ens/eQT3WOOJiRwNCGByGbN6DBiBK1vuIHGXboQ2awZYZGROEpKKDh/nvPHj5OemMixzZs5/v33VSaRzmPHMtTC+0laLikUFZfqJgSAtKxcVm9K8mgMQsCyuX67h6pfEEJwx5IlRF51VZWFTnLT0ti7dCl7ly51+3M7jx3L3atWWW5qszNL3j6YrWXTKwPl8aalCZuNYfPmMXHVKuo28uxu4bagIIa+9hr3rl1LUKi1p8/LpFALV7fWXxEn+Z5uEyYw4/Bh+kyb5pF/wVv068cjO3YwZPZshM36p5T1/wtMIJOC9dRp0ICxixfzdHIyA596ypArh1YDBzJx1Sqm79xJi379DIjSN1huTMEXdGglk4JVRbVqxa3vvMPIBQtI3ryZowkJHN+6lYyDB10ufwYIDg+nee/edBg1ik5jxuhWcbY6yyWFyLphKIlxZochWZwtOJirR43i6lGjACgtKuJccjLnjh2jKDf3f9OWI6KjCbviChq0b09UmzaWnHdQU5ZLCpLkCcFhYTTu2pXGXbuaHYrp5JiCJEkVyKQgSVIFRiUF7c0UJCPoz9SyJvld8RBh0HfFmKSgoF0uWXKfIM3sEAwmvyseomDMd8WgKwWhvVRMMoA4YnYERhIgvyseooAh3xVjkoIj6CtD+pEuJ2z+9rv9p9kB+Ktg+LcR/RiSFESv2SfQ34NQqi3Bz6Lbnw6bHYaRZglxCLDWjqvWsPuPQqQY0ZFxTx8ErxjWl6RShDvl03yWQH5XjCbcK7VXgWFJQXSP24DCZqP6k/iB7q9UZ28Gy3lJLUG/w+w4/MjGWUIYtrW1sfMUwkLvAY4Z2mcgEqQD9wjhn6XThRCKgDsFaFfblWriRCkYWgjS0KQgOr90FhiLQY9GAlQm2MaIHnF+fcLMEiLdrn5XLq+pJ1VXqgNGxwlh6O/Q8BmNokfcIez0BXYZ3XcA2EswfUX3l/eYHYg3vCzEHtRS8fvNjsVqFNgpoO/LQhheZswj05xFr7g0ujMQISagblMmuXYGIWYSzADRNe5k1Yf7j9lCnGgE/YS6A7ac2FQFAacETO8Ig2YJ4ZHfl6Dill/tAO2dWWtJSYoLpYQhCG4HegItUPc7tHbNqtorQd2b8RSCRBDriYj+VnR40ufLpntanKKEB8HNAm4HugtooajflUCtfVcMZChwyqaW6F9fAlvjhCg2+HNiqDQWqDj9xBj8YZIk+b4YnPKAXCUpSVIFNtRLlHKBekkvSYHM+bwvtgGnnV5o6uVgJEkyXzOnP6fZqDji29bLwUiSZD7n8z7dBuxzemGUl4ORJMl8zuf9PoCRXBp5zAGiTAhKkiRzRAO5XMoBwwHCUMs4lb/4plnRSZLkdQu4dO6fwWnQ8QWnhgLUSUaSJPm33qjne/m5/5xzYwRw0qnxJBVHJCVJ8i/Ngd+5dM6nAOGVD7oBKHI66BTQ12shSpLkLdeiJoHyc70YGKJ38CNUnPZcAMxHHYyQJMna6qOOITjfMijAVOeDhMYbpwHvUXGW00UgAfgaOIq6oKfU8JAlSTJSMOqCsqtRHzuOAOo5tRcDjwEfOb9JKykADAbigVaGhylJki9IASYBP1Ru0FsQtQ3oiDoaedZjYUmS5G1ngGeATmgkBNC/UnAWCtwIxAK9UEctm6LOb5AkyXcVoa5tSqWsHgOwFbWmh67/B0zUzRw09u4NAAAAAElFTkSuQmCC"},87915:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/mul_result-6e197c548f91d0d0e5071fc108183a42.png"},31021:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/multiplication-0cc3f3878fc0c97e1c79a0b0ba8a837c.png"},21885:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/partial_almost_filled-4b762452f9bb256886378c0f5607ed2a.png"},36058:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/partial_completed_example-c38ede5668459128fd92ddac7054e655.png"},7101:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/partial_example-780a8525a6ae741813cd3ec025b173fc.png"},16391:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/pipeline_example-2666efd85b8185b116c40ff07b002685.png"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>r});var i=s(67294);const t={},a=i.createContext(t);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/19d0bdf3.eacb4986.js b/assets/js/19d0bdf3.18bba30b.js similarity index 82% rename from assets/js/19d0bdf3.eacb4986.js rename to assets/js/19d0bdf3.18bba30b.js index 84e6acd81..70e88e6b0 100644 --- a/assets/js/19d0bdf3.eacb4986.js +++ b/assets/js/19d0bdf3.18bba30b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7662],{80477:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>a});var o=n(85893),t=n(11151);const i={title:"Cloud Framework",sidebar_label:"Cloud Framework",sidebar_position:1,keywords:["component"],draft:!1},l=void 0,s={id:"reference/cloud-framework/cloud-framework",title:"Cloud Framework",description:"A high level description of the set of the available cloud framework components.",source:"@site/docs/reference/cloud-framework/cloud-framework.md",sourceDirName:"reference/cloud-framework",slug:"/reference/cloud-framework/",permalink:"/next/reference/cloud-framework/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Cloud Framework",sidebar_label:"Cloud Framework",sidebar_position:1,keywords:["component"],draft:!1},sidebar:"myAutogeneratedSidebar",previous:{title:"Reference",permalink:"/next/category/reference"},next:{title:"Darklang CLI",permalink:"/next/reference/darklang-cli/"}},c={},a=[];function d(e){const r={li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.p,{children:"A high level description of the set of the available cloud framework components."}),"\n",(0,o.jsx)(r.p,{children:"Introduces:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:"Provisioning"}),"\n",(0,o.jsx)(r.li,{children:"Deployment"}),"\n",(0,o.jsx)(r.li,{children:"ORM-less"}),"\n",(0,o.jsx)(r.li,{children:"Datastore"}),"\n",(0,o.jsx)(r.li,{children:"Queues"}),"\n",(0,o.jsx)(r.li,{children:"..."}),"\n"]})]})}function u(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,r,n)=>{n.d(r,{Z:()=>s,a:()=>l});var o=n(67294);const t={},i=o.createContext(t);function l(e){const r=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8842],{54566:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>a});var o=n(74848),t=n(28453);const i={title:"Cloud Framework",sidebar_label:"Cloud Framework",sidebar_position:1,keywords:["component"],draft:!1},l=void 0,s={id:"reference/cloud-framework/cloud-framework",title:"Cloud Framework",description:"A high level description of the set of the available cloud framework components.",source:"@site/docs/reference/cloud-framework/cloud-framework.md",sourceDirName:"reference/cloud-framework",slug:"/reference/cloud-framework/",permalink:"/next/reference/cloud-framework/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Cloud Framework",sidebar_label:"Cloud Framework",sidebar_position:1,keywords:["component"],draft:!1},sidebar:"myAutogeneratedSidebar",previous:{title:"Reference",permalink:"/next/category/reference"},next:{title:"Darklang CLI",permalink:"/next/reference/darklang-cli/"}},c={},a=[];function d(e){const r={li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.p,{children:"A high level description of the set of the available cloud framework components."}),"\n",(0,o.jsx)(r.p,{children:"Introduces:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:"Provisioning"}),"\n",(0,o.jsx)(r.li,{children:"Deployment"}),"\n",(0,o.jsx)(r.li,{children:"ORM-less"}),"\n",(0,o.jsx)(r.li,{children:"Datastore"}),"\n",(0,o.jsx)(r.li,{children:"Queues"}),"\n",(0,o.jsx)(r.li,{children:"..."}),"\n"]})]})}function u(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,r,n)=>{n.d(r,{R:()=>l,x:()=>s});var o=n(96540);const t={},i=o.createContext(t);function l(e){const r=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.0c09da10.js b/assets/js/1a4e3797.0c09da10.js new file mode 100644 index 000000000..c37633333 --- /dev/null +++ b/assets/js/1a4e3797.0c09da10.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.0c09da10.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2138],{72733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},74103:(e,t,r)=>{"use strict";var n=r(36571),i=r(19127),s=r(42223),a=r(33371),c=r(67691);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(16938),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},46732:(e,t,r)=>{"use strict";var n=r(72733);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(73014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},19127:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e,threshold:t.threshold||0});return delete r.$$id,r}))}},e.exports=t},42223:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},44054:(e,t,r)=>{"use strict";var n=r(29110),i=r(40317),s=r(21383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},33371:(e,t,r)=>{"use strict";var n=r(29110),i=r(20849),s=r(14843),a=r(44728),c=r(40317),o=r(21383),u=r(17507),h=r(72208),f=r(44054);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},76673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m{"use strict";var n=r(78965),i=r(29110),s=r(2909),a=r(20849),c=r(43917),o=r(7577),u=r(44728),h=r(38601),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(76673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),v=d(e.facets),g=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=g[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=v[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=g[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=v[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=i.indexOf(t)>-1;a||void 0===s[t]?a||n.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},36571:(e,t,r)=>{"use strict";var n=r(72733),i=r(46732),s=r(2909).escapeFacetValue,a=r(73014),c=r(44728),o=r(40317),u=r(21383),h=r(19127),f=r(42223),l=r(49228),m=r(33371),d=r(67691),p=r(57749),v=r(16938);function g(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+v+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(g,n),g.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},g.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},g.prototype.recommend=function(){return this._recommend(),this},g.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},g.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},g.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},g.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},g.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},g.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},g.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},g.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},g.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},g.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},g.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},g.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},g.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},g.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},g.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},g.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},g.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},g.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},g.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},g.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},g.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},g.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},g.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},g.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},g.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},g.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},g.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},g.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},g.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},g.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},g.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},g.prototype.setCurrentPage=y,g.prototype.setPage=y,g.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},g.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},g.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},g.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},g.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},g.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},g.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},g.prototype.hasTag=function(e){return this.state.isTagRefined(e)},g.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},g.prototype.getIndex=function(){return this.state.index},g.prototype.getCurrentPage=R,g.prototype.getPage=R,g.prototype.getTags=function(){return this.state.tagRefinements},g.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},g.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},g.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},g.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},g.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},g.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t0},g.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},g.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},g.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},g.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+v+")"),this.client=e),this},g.prototype.getClient=function(){return this.client},g.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},g.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},g.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=g},78965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},29110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},20849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},7577:(e,t,r)=>{"use strict";var n=r(20849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},73014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},14843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},44728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},21383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},38601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},17507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},49228:(e,t,r)=>{"use strict";var n=r(44728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];a>0?c.facetFilters=h.concat(f.attribute+":"+f.value):h.length>0?c.facetFilters=h:delete c.facetFilters,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},72208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},57749:(e,t,r)=>{"use strict";var n=r(20849),i=r(38657);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},16938:e=>{"use strict";e.exports="3.22.3"},83643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support .",transporterStackTrace:E(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,E(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=O(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function O(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function E(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},N=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},T=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:O(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},H=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return N(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.24.0","-").concat(e)}),o()]}),userAgent:_("4.24.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:T,searchForFacetValues:H,multipleQueries:T,multipleSearchForFacetValues:H,customRequest:A,initIndex:function(e){return function(t){return N(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}},getRecommendations:L}}))}return V.version="4.24.0",V}()},53465:(e,t,r)=>{"use strict";r.d(t,{W:()=>u});var n=r(96540),i=r(44586),s=["zero","one","two","few","many","other"];function a(e){return s.filter((function(t){return e.includes(t)}))}var c={locale:"en",pluralForms:a(["one","other"]),select:function(e){return 1===e?"one":"other"}};function o(){var e=(0,i.A)().i18n.currentLocale;return(0,n.useMemo)((function(){try{return t=e,r=new Intl.PluralRules(t),{locale:t,pluralForms:a(r.resolvedOptions().pluralCategories),select:function(e){return r.select(e)}}}catch(n){return console.error('Failed to use Intl.PluralRules for locale "'+e+'".\nDocusaurus will fallback to the default (English) implementation.\nError: '+n.message+"\n"),c}var t,r}),[e])}function u(){var e=o();return{selectMessage:function(t,r){return function(e,t,r){var n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error("For locale="+r.locale+", a maximum of "+r.pluralForms.length+" plural forms are expected ("+r.pluralForms.join(",")+"), but the message contains "+n.length+": "+e);var i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}}},74604:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var n=r(96540),i=r(34164),s=r(74103),a=r.n(s),c=r(83643),o=r.n(c),u=r(38193),h=r(5260),f=r(28774),l=r(44070),m=r(53465),d=r(24255),p=r(43807),v=r(69024),g=r(20481),y=r(21312),R=r(44586),F=r(38126),b=r(51062),j=r(41957),P=r(51107);const _={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var x=r(74848);function O(e){var t=e.docsSearchVersionsHelpers,r=Object.entries(t.allDocsData).filter((function(e){return e[1].versions.length>1}));return(0,x.jsx)("div",{className:(0,i.A)("col","col--3","padding-left--none",_.searchVersionColumn),children:r.map((function(e){var n=e[0],i=e[1],s=r.length>1?n+": ":"";return(0,x.jsx)("select",{onChange:function(e){return t.setSearchVersion(n,e.target.value)},defaultValue:t.searchVersions[n],className:_.searchVersionInput,children:i.versions.map((function(e,t){return(0,x.jsx)("option",{label:""+s+e.label,value:e.name},t)}))},n)}))})}function E(){var e,t,r,s,c,v,E=(0,R.A)().i18n.currentLocale,w=(0,F.c)().algolia,S=w.appId,A=w.apiKey,N=w.indexName,T=w.contextualSearch,H=(0,b.C)(),Q=(e=(0,m.W)().selectMessage,function(t){return e(t,(0,y.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}),C=(t=(0,l.Gy)(),r=(0,n.useState)((function(){return Object.entries(t).reduce((function(e,t){var r,n=t[0],i=t[1];return Object.assign({},e,((r={})[n]=i.versions[0].name,r))}),{})})),s=r[0],c=r[1],v=Object.values(t).some((function(e){return e.versions.length>1})),{allDocsData:t,versioningEnabled:v,searchVersions:s,setSearchVersion:function(e,t){return c((function(r){var n;return Object.assign({},r,((n={})[e]=t,n))}))}}),I=(0,d.b)(),D=I[0],k=I[1],q={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},L=(0,n.useReducer)((function(e,t){switch(t.type){case"reset":return q;case"loading":return Object.assign({},e,{loading:!0});case"update":return D!==t.value.query?e:Object.assign({},t.value,{items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)});case"advance":var r=e.totalPages>e.lastPage+1;return Object.assign({},e,{lastPage:r?e.lastPage+1:e.lastPage,hasMore:r});default:return e}}),q),V=L[0],B=L[1],M=T?["language","docusaurus_tag"]:[],z=o()(S,A),J=a()(z,N,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:M});J.on("result",(function(e){var t=e.results,r=t.query,n=t.hits,i=t.page,s=t.nbHits,a=t.nbPages;if(""!==r&&Array.isArray(n)){var c=function(e){return e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match")},o=n.map((function(e){var t=e.url,r=e._highlightResult.hierarchy,n=e._snippetResult,i=void 0===n?{}:n,s=Object.keys(r).map((function(e){return c(r[e].value)}));return{title:s.pop(),url:H(t),summary:i.content?c(i.content.value)+"...":"",breadcrumbs:s}}));B({type:"update",value:{items:o,query:r,totalResults:s,totalPages:a,lastPage:i,hasMore:a>i+1,loading:!1}})}else B({type:"reset"})}));var W=(0,n.useState)(null),U=W[0],$=W[1],K=(0,n.useRef)(0),X=(0,n.useRef)(u.A.canUseIntersectionObserver&&new IntersectionObserver((function(e){var t=e[0],r=t.isIntersecting,n=t.boundingClientRect.y;r&&K.current>n&&B({type:"advance"}),K.current=n}),{threshold:1})),G=function(){return D?(0,y.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:D}):(0,y.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})},Z=(0,p._q)((function(e){void 0===e&&(e=0),T&&(J.addDisjunctiveFacetRefinement("docusaurus_tag","default"),J.addDisjunctiveFacetRefinement("language",E),Object.entries(C.searchVersions).forEach((function(e){var t=e[0],r=e[1];J.addDisjunctiveFacetRefinement("docusaurus_tag","docs-"+t+"-"+r)}))),J.setQuery(D).setPage(e).search()}));return(0,n.useEffect)((function(){if(U){var e=X.current;return e?(e.observe(U),function(){return e.unobserve(U)}):function(){return!0}}}),[U]),(0,n.useEffect)((function(){B({type:"reset"}),D&&(B({type:"loading"}),setTimeout((function(){Z()}),300))}),[D,C.searchVersions,Z]),(0,n.useEffect)((function(){V.lastPage&&0!==V.lastPage&&Z(V.lastPage)}),[Z,V.lastPage]),(0,x.jsxs)(j.A,{children:[(0,x.jsxs)(h.A,{children:[(0,x.jsx)("title",{children:(0,g.s)(G())}),(0,x.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,x.jsxs)("div",{className:"container margin-vert--lg",children:[(0,x.jsx)(P.A,{as:"h1",children:G()}),(0,x.jsxs)("form",{className:"row",onSubmit:function(e){return e.preventDefault()},children:[(0,x.jsx)("div",{className:(0,i.A)("col",_.searchQueryColumn,{"col--9":C.versioningEnabled,"col--12":!C.versioningEnabled}),children:(0,x.jsx)("input",{type:"search",name:"q",className:_.searchQueryInput,placeholder:(0,y.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:function(e){return k(e.target.value)},value:D,autoComplete:"off",autoFocus:!0})}),T&&C.versioningEnabled&&(0,x.jsx)(O,{docsSearchVersionsHelpers:C})]}),(0,x.jsxs)("div",{className:"row",children:[(0,x.jsx)("div",{className:(0,i.A)("col","col--8",_.searchResultsColumn),children:!!V.totalResults&&Q(V.totalResults)}),(0,x.jsx)("div",{className:(0,i.A)("col","col--4","text--right",_.searchLogoColumn),children:(0,x.jsx)(f.A,{to:"https://www.algolia.com/","aria-label":(0,y.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,x.jsx)("svg",{viewBox:"0 0 168 24",className:_.algoliaLogo,children:(0,x.jsxs)("g",{fill:"none",children:[(0,x.jsx)("path",{className:_.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,x.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,x.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),V.items.length>0?(0,x.jsx)("main",{children:V.items.map((function(e,t){var r=e.title,n=e.url,s=e.summary,a=e.breadcrumbs;return(0,x.jsxs)("article",{className:_.searchResultItem,children:[(0,x.jsx)(P.A,{as:"h2",className:_.searchResultItemHeading,children:(0,x.jsx)(f.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,x.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,x.jsx)("ul",{className:(0,i.A)("breadcrumbs",_.searchResultItemPath),children:a.map((function(e,t){return(0,x.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)}))})}),s&&(0,x.jsx)("p",{className:_.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}})]},t)}))}):[D&&!V.loading&&(0,x.jsx)("p",{children:(0,x.jsx)(y.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!V.loading&&(0,x.jsx)("div",{className:_.loadingSpinner},"spinner")],V.hasMore&&(0,x.jsx)("div",{className:_.loader,ref:$,children:(0,x.jsx)(y.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function w(){return(0,x.jsx)(v.e3,{className:"search-page-wrapper",children:(0,x.jsx)(E,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.67c5fd4f.js.LICENSE.txt b/assets/js/1a4e3797.0c09da10.js.LICENSE.txt similarity index 100% rename from assets/js/1a4e3797.67c5fd4f.js.LICENSE.txt rename to assets/js/1a4e3797.0c09da10.js.LICENSE.txt diff --git a/assets/js/1a4e3797.67c5fd4f.js b/assets/js/1a4e3797.67c5fd4f.js deleted file mode 100644 index b603cfe38..000000000 --- a/assets/js/1a4e3797.67c5fd4f.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.67c5fd4f.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7920],{17331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(49374),i=r(67450),s=r(43650),a=r(17775),c=r(23076);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(24336),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},68078:(e,t,r)=>{"use strict";var n=r(17331);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(14853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},67450:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e,threshold:t.threshold||0});return delete r.$$id,r}))}},e.exports=t},43650:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},82437:(e,t,r)=>{"use strict";var n=r(52344),i=r(90116),s=r(49803),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},17775:(e,t,r)=>{"use strict";var n=r(52344),i=r(7888),s=r(22686),a=r(60185),c=r(90116),o=r(49803),u=r(28023),h=r(46801),f=r(82437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},10210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m{"use strict";var n=r(74587),i=r(52344),s=r(94039),a=r(7888),c=r(69725),o=r(82293),u=r(60185),h=r(42148),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(10210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),v=d(e.facets),g=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=g[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=v[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=g[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=v[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=i.indexOf(t)>-1;a||void 0===s[t]?a||n.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},49374:(e,t,r)=>{"use strict";var n=r(17331),i=r(68078),s=r(94039).escapeFacetValue,a=r(14853),c=r(60185),o=r(90116),u=r(49803),h=r(67450),f=r(43650),l=r(96394),m=r(17775),d=r(23076),p=r(97878),v=r(24336);function g(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+v+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(g,n),g.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},g.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},g.prototype.recommend=function(){return this._recommend(),this},g.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},g.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},g.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},g.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},g.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},g.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},g.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},g.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},g.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},g.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},g.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},g.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},g.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},g.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},g.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},g.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},g.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},g.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},g.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},g.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},g.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},g.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},g.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},g.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},g.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},g.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},g.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},g.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},g.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},g.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},g.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},g.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},g.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},g.prototype.setCurrentPage=y,g.prototype.setPage=y,g.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},g.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},g.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},g.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},g.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},g.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},g.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},g.prototype.hasTag=function(e){return this.state.isTagRefined(e)},g.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},g.prototype.getIndex=function(){return this.state.index},g.prototype.getCurrentPage=R,g.prototype.getPage=R,g.prototype.getTags=function(){return this.state.tagRefinements},g.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},g.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},g.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},g.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},g.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},g.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t0},g.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},g.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},g.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},g.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+v+")"),this.client=e),this},g.prototype.getClient=function(){return this.client},g.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},g.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},g.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=g},74587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},52344:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},94039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},82293:(e,t,r)=>{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},14853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},22686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},60185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},49803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},42148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},28023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},96394:(e,t,r)=>{"use strict";var n=r(60185);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];a>0?c.facetFilters=h.concat(f.attribute+":"+f.value):h.length>0?c.facetFilters=h:delete c.facetFilters,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},46801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},97878:(e,t,r)=>{"use strict";var n=r(7888),i=r(7948);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},24336:e=>{"use strict";e.exports="3.22.3"},70290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support .",transporterStackTrace:E(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,E(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=O(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function O(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function E(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},N=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},A=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},H=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:O(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},Q=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return A(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},T=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.24.0","-").concat(e)}),o()]}),userAgent:_("4.24.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:H,searchForFacetValues:Q,multipleQueries:H,multipleSearchForFacetValues:Q,customRequest:N,initIndex:function(e){return function(t){return A(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:T}})}},getRecommendations:L}}))}return V.version="4.24.0",V}()},88824:(e,t,r)=>{"use strict";r.d(t,{c:()=>u});var n=r(67294),i=r(52263),s=["zero","one","two","few","many","other"];function a(e){return s.filter((function(t){return e.includes(t)}))}var c={locale:"en",pluralForms:a(["one","other"]),select:function(e){return 1===e?"one":"other"}};function o(){var e=(0,i.Z)().i18n.currentLocale;return(0,n.useMemo)((function(){try{return t=e,r=new Intl.PluralRules(t),{locale:t,pluralForms:a(r.resolvedOptions().pluralCategories),select:function(e){return r.select(e)}}}catch(n){return console.error('Failed to use Intl.PluralRules for locale "'+e+'".\nDocusaurus will fallback to the default (English) implementation.\nError: '+n.message+"\n"),c}var t,r}),[e])}function u(){var e=o();return{selectMessage:function(t,r){return function(e,t,r){var n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error("For locale="+r.locale+", a maximum of "+r.pluralForms.length+" plural forms are expected ("+r.pluralForms.join(",")+"), but the message contains "+n.length+": "+e);var i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}}},39172:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var n=r(67294),i=r(90512),s=r(8131),a=r.n(s),c=r(70290),o=r.n(c),u=r(10412),h=r(35742),f=r(33692),l=r(80143),m=r(88824),d=r(66177),p=r(69688),v=r(10833),g=r(82128),y=r(95999),R=r(52263),F=r(6278),b=r(239),j=r(63211),P=r(92503);const _={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var x=r(85893);function O(e){var t=e.docsSearchVersionsHelpers,r=Object.entries(t.allDocsData).filter((function(e){return e[1].versions.length>1}));return(0,x.jsx)("div",{className:(0,i.Z)("col","col--3","padding-left--none",_.searchVersionColumn),children:r.map((function(e){var n=e[0],i=e[1],s=r.length>1?n+": ":"";return(0,x.jsx)("select",{onChange:function(e){return t.setSearchVersion(n,e.target.value)},defaultValue:t.searchVersions[n],className:_.searchVersionInput,children:i.versions.map((function(e,t){return(0,x.jsx)("option",{label:""+s+e.label,value:e.name},t)}))},n)}))})}function E(){var e,t,r,s,c,v,E=(0,R.Z)().i18n.currentLocale,w=(0,F.L)().algolia,S=w.appId,N=w.apiKey,A=w.indexName,H=w.contextualSearch,Q=(0,b.l)(),T=(e=(0,m.c)().selectMessage,function(t){return e(t,(0,y.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}),C=(t=(0,l._r)(),r=(0,n.useState)((function(){return Object.entries(t).reduce((function(e,t){var r,n=t[0],i=t[1];return Object.assign({},e,((r={})[n]=i.versions[0].name,r))}),{})})),s=r[0],c=r[1],v=Object.values(t).some((function(e){return e.versions.length>1})),{allDocsData:t,versioningEnabled:v,searchVersions:s,setSearchVersion:function(e,t){return c((function(r){var n;return Object.assign({},r,((n={})[e]=t,n))}))}}),I=(0,d.K)(),D=I[0],k=I[1],q={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},L=(0,n.useReducer)((function(e,t){switch(t.type){case"reset":return q;case"loading":return Object.assign({},e,{loading:!0});case"update":return D!==t.value.query?e:Object.assign({},t.value,{items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)});case"advance":var r=e.totalPages>e.lastPage+1;return Object.assign({},e,{lastPage:r?e.lastPage+1:e.lastPage,hasMore:r});default:return e}}),q),V=L[0],B=L[1],M=H?["language","docusaurus_tag"]:[],z=o()(S,N),J=a()(z,A,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:M});J.on("result",(function(e){var t=e.results,r=t.query,n=t.hits,i=t.page,s=t.nbHits,a=t.nbPages;if(""!==r&&Array.isArray(n)){var c=function(e){return e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match")},o=n.map((function(e){var t=e.url,r=e._highlightResult.hierarchy,n=e._snippetResult,i=void 0===n?{}:n,s=Object.keys(r).map((function(e){return c(r[e].value)}));return{title:s.pop(),url:Q(t),summary:i.content?c(i.content.value)+"...":"",breadcrumbs:s}}));B({type:"update",value:{items:o,query:r,totalResults:s,totalPages:a,lastPage:i,hasMore:a>i+1,loading:!1}})}else B({type:"reset"})}));var Z=(0,n.useState)(null),W=Z[0],U=Z[1],$=(0,n.useRef)(0),K=(0,n.useRef)(u.Z.canUseIntersectionObserver&&new IntersectionObserver((function(e){var t=e[0],r=t.isIntersecting,n=t.boundingClientRect.y;r&&$.current>n&&B({type:"advance"}),$.current=n}),{threshold:1})),X=function(){return D?(0,y.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:D}):(0,y.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})},G=(0,p.zX)((function(e){void 0===e&&(e=0),H&&(J.addDisjunctiveFacetRefinement("docusaurus_tag","default"),J.addDisjunctiveFacetRefinement("language",E),Object.entries(C.searchVersions).forEach((function(e){var t=e[0],r=e[1];J.addDisjunctiveFacetRefinement("docusaurus_tag","docs-"+t+"-"+r)}))),J.setQuery(D).setPage(e).search()}));return(0,n.useEffect)((function(){if(W){var e=K.current;return e?(e.observe(W),function(){return e.unobserve(W)}):function(){return!0}}}),[W]),(0,n.useEffect)((function(){B({type:"reset"}),D&&(B({type:"loading"}),setTimeout((function(){G()}),300))}),[D,C.searchVersions,G]),(0,n.useEffect)((function(){V.lastPage&&0!==V.lastPage&&G(V.lastPage)}),[G,V.lastPage]),(0,x.jsxs)(j.Z,{children:[(0,x.jsxs)(h.Z,{children:[(0,x.jsx)("title",{children:(0,g.p)(X())}),(0,x.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,x.jsxs)("div",{className:"container margin-vert--lg",children:[(0,x.jsx)(P.Z,{as:"h1",children:X()}),(0,x.jsxs)("form",{className:"row",onSubmit:function(e){return e.preventDefault()},children:[(0,x.jsx)("div",{className:(0,i.Z)("col",_.searchQueryColumn,{"col--9":C.versioningEnabled,"col--12":!C.versioningEnabled}),children:(0,x.jsx)("input",{type:"search",name:"q",className:_.searchQueryInput,placeholder:(0,y.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:function(e){return k(e.target.value)},value:D,autoComplete:"off",autoFocus:!0})}),H&&C.versioningEnabled&&(0,x.jsx)(O,{docsSearchVersionsHelpers:C})]}),(0,x.jsxs)("div",{className:"row",children:[(0,x.jsx)("div",{className:(0,i.Z)("col","col--8",_.searchResultsColumn),children:!!V.totalResults&&T(V.totalResults)}),(0,x.jsx)("div",{className:(0,i.Z)("col","col--4","text--right",_.searchLogoColumn),children:(0,x.jsx)(f.Z,{to:"https://www.algolia.com/","aria-label":(0,y.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,x.jsx)("svg",{viewBox:"0 0 168 24",className:_.algoliaLogo,children:(0,x.jsxs)("g",{fill:"none",children:[(0,x.jsx)("path",{className:_.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,x.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,x.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),V.items.length>0?(0,x.jsx)("main",{children:V.items.map((function(e,t){var r=e.title,n=e.url,s=e.summary,a=e.breadcrumbs;return(0,x.jsxs)("article",{className:_.searchResultItem,children:[(0,x.jsx)(P.Z,{as:"h2",className:_.searchResultItemHeading,children:(0,x.jsx)(f.Z,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,x.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,x.jsx)("ul",{className:(0,i.Z)("breadcrumbs",_.searchResultItemPath),children:a.map((function(e,t){return(0,x.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)}))})}),s&&(0,x.jsx)("p",{className:_.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}})]},t)}))}):[D&&!V.loading&&(0,x.jsx)("p",{children:(0,x.jsx)(y.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!V.loading&&(0,x.jsx)("div",{className:_.loadingSpinner},"spinner")],V.hasMore&&(0,x.jsx)("div",{className:_.loader,ref:U,children:(0,x.jsx)(y.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function w(){return(0,x.jsx)(v.FG,{className:"search-page-wrapper",children:(0,x.jsx)(E,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a9698d7.66a63dab.js b/assets/js/1a9698d7.66a63dab.js deleted file mode 100644 index ba7502336..000000000 --- a/assets/js/1a9698d7.66a63dab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[410],{43948:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>d,toc:()=>l});var s=r(85893),i=r(11151);const t={},a="Darklang Release 2",d={id:"changelog/release-2",title:"Darklang Release 2",description:"June 6th, 2022",source:"@site/docs-classic/changelog/release-2.md",sourceDirName:"changelog",slug:"/changelog/release-2",permalink:"/changelog/release-2",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-2.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 3 - June, 2022",permalink:"/changelog/release-3"},next:{title:"Release 1",permalink:"/changelog/release-1"}},o={},l=[{value:"Major changes",id:"major-changes",level:2},{value:"Error messages",id:"error-messages",level:3},{value:"Result.Errors",id:"resulterrors",level:4},{value:"Runtime errors",id:"runtime-errors",level:4},{value:"Minor improvements and fixes",id:"minor-improvements-and-fixes",level:2},{value:"Breaking changes",id:"breaking-changes",level:2},{value:"String casing",id:"string-casing",level:3},{value:"String ordering",id:"string-ordering",level:3},{value:"HTTP Clients",id:"http-clients",level:3},{value:"Generating JSON",id:"generating-json",level:3},{value:"Parsing JSON",id:"parsing-json",level:3},{value:"HTTP stack",id:"http-stack",level:3},{value:"Testing changes",id:"testing-changes",level:2},{value:"Operational changes",id:"operational-changes",level:2},{value:"Documentation changes",id:"documentation-changes",level:2},{value:"Contributing changes",id:"contributing-changes",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"darklang-release-2",children:"Darklang Release 2"})}),"\n",(0,s.jsx)(n.p,{children:"June 6th, 2022"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["See the ",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/darklang-release-3/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,s.jsxs)(n.p,{children:["Darklang Release 2 is the culmination of 20 months work of rewriting the backend\nfrom OCaml to F#. This was done to give us more productivity by allowing us use\nmore 3rd party SDKs, to solve operational issues, and to make it easier to\ncontribute. Our reasons for making the change were discussed at the time:\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/new-backend-fsharp/",children:"1"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/why-dark-didnt-choose-rust/",children:"2"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/leaving-ocaml/",children:"3"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The editor backend was fully migrated by April 2nd."}),"\n",(0,s.jsx)(n.li,{children:"HTTP backends (for builtwithdark.com) were finished converting on May 3rd."}),"\n",(0,s.jsx)(n.li,{children:"The migration to the new queues was fully converted on May 27th."}),"\n",(0,s.jsx)(n.li,{children:"The execution engine in the editor was switched over on June 5th."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The change was documented in a series of blog posts:\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/hows-the-dark-rewrite-going/",children:"1"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/changes-the-the-dark-rewrite/",children:"2"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/optimizing-tasks-in-fsharp/",children:"3"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/benchmarking-fsharp6-tasks/",children:"4"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/darklang-year-in-review-2021/",children:"5"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/try-out-the-new-darklang-backend/",children:"6"}),", and\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/backend-rewrite-complete/",children:"7"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Thanks to everyone who contributed, including\n",(0,s.jsx)(n.a,{href:"https://github.com/Athinanarof",children:"Araceli S\xe1nchez"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/levlaz",children:"Lev Lazinskiy"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/mariajdab",children:"Mar\xeda Jos\xe9 D\xe1vila"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/mjeffryes",children:"Matthew Jeffryes"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/jwalter",children:"jwalter"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/danicampagna",children:"Daniela Campagna"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/sxmanton",children:"Sean Manton"}),", and especially\n",(0,s.jsx)(n.a,{href:"https://github.com/stachudotnet",children:"Stachu Korick"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"major-changes",children:"Major changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Darklang's implementation is now asynchronous, meaning that your programs will\nno longer be stuck behind other users' programs making HTTP or DB calls. This\nwas a major source of slow Dark programs experienced by most users."}),"\n",(0,s.jsx)(n.p,{children:"As well as massively reducing latency for programs written in Dark, the editor\nnow loads much faster."}),"\n",(0,s.jsx)(n.p,{children:"We have also switched from dozens of tiny machines to a smaller number of much\nmore powerful machines. This makes your programs run faster on average, even\nwhen accounting for the switch to an asynchronous implementation."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You can now put a lambda in a variable and pipe into it."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Most error messages are improved, especially for bad input."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"The queues have been rewritten and should not longer suffer from the old\nsources of occasional downtime and slow-down."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"During a deploy of the Dark service, cron jobs no longer run the risk of\nrunning twice."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is now a ",(0,s.jsx)(n.a,{href:"https://status.darklang.com",children:"Status page"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Dark's internal firewalls have been significantly improved"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Several bottlenecks to outbound HTTP requests have been identified and removed"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String::length"})," is now ",(0,s.jsx)(n.code,{children:"O(1)"})," instead of ",(0,s.jsx)(n.code,{children:"O(N)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"JSON output is now significantly faster"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When reading strings from a user, the string is only passed over once."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Traces are now stored in the background, after a request has completed,\ngreatly reducing response time on HTTP requests to Dark programs."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Dark has moved to more powerful cloud machines, going from Google' Cloud's\ndeprecated N1 machines to extremely powerful T2D machines (2.3x faster)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The rewrite also addressed some underlying issues that will come out in new\nfeatures soon, including a better type system, support for characters and\ntuples, fixes for poor behavior in Date and String functions, and more. These\nissues are tracked in our new\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/projects/1#column-15173588",children:"project tracker"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"error-messages",children:"Error messages"}),"\n",(0,s.jsx)(n.p,{children:"All error messages have been renovated, attempting to make them more consistent\nand to reuse error message machinery. As a result, a majority of Dark error\nmessages have changed. If you were relying on the explicit format of a Dark\nlanguage or StdLib error message, expect that it will be different."}),"\n",(0,s.jsx)(n.p,{children:"If you do any error handling which relies specifically on the text of an error\nmessage coming from Dark, we recommend you no longer do that, and just use the\npresence of the error instead of the text."}),"\n",(0,s.jsx)(n.p,{children:"There are two places in Dark which use string error messages:"}),"\n",(0,s.jsxs)(n.h4,{id:"resulterrors",children:[(0,s.jsx)(n.code,{children:"Result.Error"}),"s"]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"Error"})," enum (referred to as ",(0,s.jsx)(n.code,{children:"Result.Error"})," below for clarity), will contain\na string error in most cases, which you might be using directly or indirectly."]}),"\n",(0,s.jsxs)(n.p,{children:["You might be accessing ",(0,s.jsx)(n.code,{children:"Result.Error"}),"s and their text contents directly using\nthe ",(0,s.jsx)(n.code,{children:"match"})," statement."]}),"\n",(0,s.jsxs)(n.p,{children:["You might also be accessing their text contents indirectly, using ",(0,s.jsx)(n.code,{children:"toString"}),", or\nother stringifying functions, such as ",(0,s.jsx)(n.code,{children:"toString"}),", ",(0,s.jsx)(n.code,{children:"JSON::"})," functions and\n",(0,s.jsx)(n.code,{children:"HTTPClient::"})," functions. This is only true if you taken the function returning\nthe ",(0,s.jsx)(n.code,{children:"Result.Error"})," off the error rail. This text may also make it to your\nweb/mobile clients or API consumers."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Result.Error"}),"s returned via a HTTP handler are not presented to the user, so\ntext cannot leak that way."]}),"\n",(0,s.jsx)(n.h4,{id:"runtime-errors",children:"Runtime errors"}),"\n",(0,s.jsx)(n.p,{children:"Runtime errors (including type errors) are not accessible via Dark programs, and\nwill always terminate the Dark program when they are accessed. As a result, the\ntext of any runtime error should not be accessible to your programs or your\nusers."}),"\n",(0,s.jsx)(n.h2,{id:"minor-improvements-and-fixes",children:"Minor improvements and fixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark used to return the ",(0,s.jsx)(n.code,{children:"Access-Control-Allow-Origin"})," header in lower-case, it\nis now returned in mixed case."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When making a web request to your Dark application, if you did not specific a\n",(0,s.jsx)(n.code,{children:"user-agent"})," header, Dark used to add a ",(0,s.jsx)(n.code,{children:"user-agent"})," header of\n",(0,s.jsx)(n.code,{children:"ocaml-cohttp/1.2.0"}),". We no longer add this header."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When making a web request to your Dark application with a ",(0,s.jsx)(n.code,{children:"content-type"}),"\nheader of ",(0,s.jsx)(n.code,{children:"text/ping"}),", Dark used to ignore the code and immediately return a\nresponse of status code 418. It now processes the request instead."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"HttpClient::*"})," functions called with usernames and passwords in the URL can\nnow support arbitrary UTF-8 (in the past, Unicode was not supported.)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"X509::pemCertificatePublicKeys"})," used to only work for RSA keys. It now also\nsupports DSA and ECDSA keys. The old version would read ECDSA keys and return\nan incorrect answer - it now returns a correct answer."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String::split"})," would fail if the 2nd argument was ",(0,s.jsx)(n.code,{children:'""'})," and the first argument\nwas a complex Unicode character, such as ",(0,s.jsx)(n.code,{children:'String::split "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f\u200d\ufe0f\ud83c\uddf5\ud83c\uddf7" ""'}),". This\nis now split correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String.trim"}),", ",(0,s.jsx)(n.code,{children:"String::trimEnd"})," and ",(0,s.jsx)(n.code,{children:"String::trimStart"})," worked incorrectly in\nsome Unicode situations, they now work correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"breaking-changes",children:"Breaking changes"}),"\n",(0,s.jsx)(n.p,{children:"These breaking changes were documented and announced many months in advance of\nswitching over to the new version of Darklang. We also very careful deployed the\nnew code, watching for suspicious changes in any Dark programs that were\nrunning. In the rare case where something went awry, we contacted the users and\nworked with them to ensure a seamless transition."}),"\n",(0,s.jsx)(n.h3,{id:"string-casing",children:"String casing"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"String::toLowercase_v0"})," and ",(0,s.jsx)(n.code,{children:"String::toUppercase_v0"})," worked correctly in the\nold version of Dark, for all unicode. In the new version, the library we are\nusing does not correctly handle some case changes, instead keeping the\noriginal character. This happens when the replacement is a different length\nthan the character being replaced (for example, ",(0,s.jsx)(n.code,{children:'"\u0587"'})," should be ",(0,s.jsx)(n.code,{children:'"\u0535\u0552"'})," when\nconverted to upper case, which the old version did correctly and the new\nversion does not). We plan to fix this at a later point."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"string-ordering",children:"String ordering"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Functions whose output relies on the internal ordering of a ",(0,s.jsx)(n.code,{children:"Dict"})," may have\ndifferent outputs, specifically, the output Lists may be in a different order.\nExamples include ",(0,s.jsx)(n.code,{children:"Dict::keys"}),", ",(0,s.jsx)(n.code,{children:"Dict::values"}),", and ",(0,s.jsx)(n.code,{children:"Dict::toList"})," which return\n",(0,s.jsx)(n.code,{children:"List"}),"s of values which are ordered based on the internal ordering in the\noriginal ",(0,s.jsx)(n.code,{children:"Dict"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When calling ",(0,s.jsx)(n.code,{children:"List::uniqueBy"}),", and there is a duplicate, the new version of\nDark may pick a different value for the duplicate. For example:"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dark",children:"List.uniqueBy_v0 [1;2;3;4] (fun x -> Int.divide_v0 x 2) = [ 1, 3, 4 ] // old Dark\nList.uniqueBy_v0 [1;2;3;4] (fun x -> Int.divide_v0 x 2) = [ 1, 2, 4 ] // new Dark\n"})}),"\n",(0,s.jsx)(n.h3,{id:"http-clients",children:"HTTP Clients"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"HttpClient::*"})," functions no longer support making requests with arbitrary\n",(0,s.jsx)(n.code,{children:"Content-Type"}),"s. They must now be\n",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type",children:"valid"}),",\nfor example ",(0,s.jsx)(n.code,{children:'"application/json"'})," or ",(0,s.jsx)(n.code,{children:'"application/json; charset=utf-8"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"generating-json",children:"Generating JSON"}),"\n",(0,s.jsx)(n.p,{children:"We have changed how JSON is generated in many cases. All the JSON generated by\nDark is now standards compliant, and uses a different formatting style."}),"\n",(0,s.jsxs)(n.p,{children:["In the old version of Dark, we would generate invalid JSON for the Float values\n",(0,s.jsx)(n.code,{children:"NaN"}),", ",(0,s.jsx)(n.code,{children:"Infinity"})," and ",(0,s.jsx)(n.code,{children:"-Infinity"}),". The old version of Dark generates them as\nbare identifiers, while the new version puts them in a string (e.g. ",(0,s.jsx)(n.code,{children:"NaN"})," vs\n",(0,s.jsx)(n.code,{children:'"NaN"'}),")."]}),"\n",(0,s.jsx)(n.p,{children:"This may occur in any of the places in which we generate JSON, which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"when responding to a HTTP request in the HTTP framework"}),"\n",(0,s.jsxs)(n.li,{children:["when making a request with ",(0,s.jsx)(n.code,{children:"HttpClient"})," (any version)"]}),"\n",(0,s.jsxs)(n.li,{children:["when calling any of:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"Dict::toJson_v0"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Object::toJson_v1"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Object::toJson_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"Twilio::sendText_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Twilio::sendText_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Note that the following ",(0,s.jsx)(n.code,{children:"JWT"})," functions do not use this new behavior, and should\nhave the exact same behavior as before, including:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JWT::signAndEncode_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JWT::signAndEncode_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JWT::signAndEncodeWithHeaders_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JWT::signAndEncodeWithHeaders_v1"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"parsing-json",children:"Parsing JSON"}),"\n",(0,s.jsx)(n.p,{children:"When parsing JSON, we no longer accept the following invalid JSON:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["bare field names, such as in ",(0,s.jsx)(n.code,{children:"{ id : 5 }"}),". You need to quote field names:\n",(0,s.jsx)(n.code,{children:'{ "id": 5 }'})]}),"\n",(0,s.jsx)(n.li,{children:"newlines and invalid bytes in JSON strings"}),"\n",(0,s.jsxs)(n.li,{children:["the bare identifiers ",(0,s.jsx)(n.code,{children:"NaN"}),", ",(0,s.jsx)(n.code,{children:"Infinity"})," and ",(0,s.jsx)(n.code,{children:"-Infinity"})," are no longer parsed\ninto valid floats (note that the old version of Dark might have generated JSON\nwith these values in it)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Dark now also allows parsing 64-bit integers (as opposed to 63-bit integers\nbefore)."}),"\n",(0,s.jsx)(n.p,{children:"Dark parses JSON:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"when receiving a HTTP request in the HTTP framework"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["when receiving a response to a request made with ",(0,s.jsx)(n.code,{children:"HttpClient"})," (any version)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"when calling any of:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JSON::parse_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::parse_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::read_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::read_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Note that ",(0,s.jsx)(n.code,{children:"JWT::verifyAndExtract_v0"})," and ",(0,s.jsx)(n.code,{children:"JWT::verifyAndExtract_v1"})," are not\naffected by this change, as they have been kept deliberately compatible with the\nold versions."]}),"\n",(0,s.jsx)(n.h3,{id:"http-stack",children:"HTTP stack"}),"\n",(0,s.jsxs)(n.p,{children:["Dark has switched to using Kestrel, a high-performance HTTP server from .NET,\nfor its HTTP server. There are some differences between the new Kestrel-based\nserver and the previous OCaml ",(0,s.jsx)(n.code,{children:"cohttp"}),"-based server:"]}),"\n",(0,s.jsx)(n.p,{children:"Large differences:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark programs can no longer set the HTTP ",(0,s.jsx)(n.code,{children:"Content-Length"})," header and it will\nbe set automatically. A ",(0,s.jsx)(n.code,{children:"Content-Length"})," header will be ignored if provided\nvia ",(0,s.jsx)(n.code,{children:"Http::response"})," or similar functions."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark is now less lenient to receiving incorrect ",(0,s.jsx)(n.code,{children:"Content-Length"})," headers. If\nthe data sent does not match the expected ",(0,s.jsx)(n.code,{children:"Content-Length"}),", the HTTP server\nwill return a 400 Bad Request error. Omitting the ",(0,s.jsx)(n.code,{children:"Content-Length"})," header is\nstill OK."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"JSON returned from HTTP requests is now formatted differently, as discussed\nabove."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Minor differences:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["When making HTTP requests to Dark:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Clients must send at least 256 bytes every 5 seconds or be timed-out"}),"\n",(0,s.jsx)(n.li,{children:"All headers must be sent in first 10 seconds"}),"\n",(0,s.jsx)(n.li,{children:"There must be fewer than 100 headers and they must fit in 32KB"}),"\n",(0,s.jsx)(n.li,{children:"The maximum size of HTTP requests to Dark is 10MB"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["HTTP responses sent by Dark","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Headers will be returned in a different order"}),"\n",(0,s.jsx)(n.li,{children:"Headers are not always lowercase anymore"}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"Date"})," header is now always present"]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"Server"})," header is now ",(0,s.jsx)(n.code,{children:"darklang"})," and always present"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"testing-changes",children:"Testing changes"}),"\n",(0,s.jsx)(n.p,{children:"We have gone from about 250 backend tests to over 5,000. We now have custom test\nframeworks for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/execution",children:"language and standard library testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/httphandler",children:"HTTP server testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/httpclient",children:"Testing HTTP clients"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/stable-dark/tree/main/backend/tests/FuzzTests",children:"Fuzz testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/stable-dark/tree/main/integration-tests",children:"Integration tests"}),"\nwere ported to ",(0,s.jsx)(n.a,{href:"https://playwright.dev/",children:"Playwright"}),", from TestCafe. They now\nrun much faster and are somewhat easier to write."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"operational-changes",children:"Operational changes"}),"\n",(0,s.jsx)(n.p,{children:"Behind the scenes, Dark has greatly improved its operations."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Switched to massively more powerful servers (requests now get 2 CPUs of a\n",(0,s.jsx)(n.a,{href:"https://cloud.google.com/blog/products/compute/compute-engine-tau-t2d-vms-now-available-for-scale-out-workloads",children:"Google Cloud T2D"}),",\nvs 0.1 CPUs of a n1d -- T2Ds are about 2.3x more powerful than N1Ds)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Separated the servers used by the Darklang editor from the ones running\nproduction applications."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Massively increased use of ",(0,s.jsx)(n.a,{href:"https://honeycomb.io",children:"observability"})," and error\ntracking to catch errors and customer issues"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Moved queues from running in the database (often taking over 50% of the CPU,\nto relying on our cloud vendor (Google PubSub). Also greatly increased\nreliability of the queues."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Nodes are now autoscaled, leading to significant cost savings."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Updated to latest version of Kubernetes, ",(0,s.jsx)(n.code,{children:"cert-manager"})," (which powers our\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/how-to/custom-domains",children:"custom domains"})," feature),\nnginx, and other tools that we use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added internal ",(0,s.jsx)(n.a,{href:"https://launchdarkly.com",children:"feature flagging"})," to give us more\ncontrol over how our infrastructure runs in production"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Significantly increased use of Kubernetes' security features, in particular\ninternal firewalls."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Standardized our production deployment process using a tool we wrote called\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/blob/8082df91676de2f26a0661bf20827a60976bb3c0/scripts/deployment/shipit",children:"shipit"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Removed nginx from our builtwithdark.com backends"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Move migrations out from startup code"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"All certs except darksa.com and darkstaticassets.com are now managed\nautomatically"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"documentation-changes",children:"Documentation changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"moved docs to docs.darklang.com"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/docs/pull/220",children:"refactored docs"})," to use the Divio\ndocumentation system, categorizing all docs into Tutorials, Reference,\nHow-tos, Walk-throughs and Discussion."]}),"\n",(0,s.jsx)(n.li,{children:"fixed all links"}),"\n",(0,s.jsxs)(n.li,{children:["redo the\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Rail discussion"})]}),"\n",(0,s.jsxs)(n.li,{children:["add a discussion of\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/discussion/queues",children:"how the Queues work"})]}),"\n",(0,s.jsxs)(n.li,{children:["improved and expanded\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/reference/keyboard-mapping",children:"keyboard shortcuts docs"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"contributing-changes",children:"Contributing changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/blob/main/CODING-GUIDE.md",children:"coding guidelines"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added significant documentation, especially READMEs and design decisions,\nthroughout the ",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark",children:"darklang repo"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Moved 99% of project collaboration to our\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark",children:"public GitHub"})," and\n",(0,s.jsx)(n.a,{href:"https://darklang.com/discord-invite",children:"public community chat"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["ported our\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/contributing/rescript-and-fsharp-for-dark-developers",children:"contributor guides"}),"\nto F#"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>d,a:()=>a});var s=r(67294);const i={},t=s.createContext(i);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a9698d7.6dd0c1a3.js b/assets/js/1a9698d7.6dd0c1a3.js new file mode 100644 index 000000000..77588ca66 --- /dev/null +++ b/assets/js/1a9698d7.6dd0c1a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9916],{70099:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>d,toc:()=>l});var s=r(74848),i=r(28453);const t={},a="Darklang Release 2",d={id:"changelog/release-2",title:"Darklang Release 2",description:"June 6th, 2022",source:"@site/docs-classic/changelog/release-2.md",sourceDirName:"changelog",slug:"/changelog/release-2",permalink:"/changelog/release-2",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/changelog/release-2.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release 3 - June, 2022",permalink:"/changelog/release-3"},next:{title:"Release 1",permalink:"/changelog/release-1"}},o={},l=[{value:"Major changes",id:"major-changes",level:2},{value:"Error messages",id:"error-messages",level:3},{value:"Result.Errors",id:"resulterrors",level:4},{value:"Runtime errors",id:"runtime-errors",level:4},{value:"Minor improvements and fixes",id:"minor-improvements-and-fixes",level:2},{value:"Breaking changes",id:"breaking-changes",level:2},{value:"String casing",id:"string-casing",level:3},{value:"String ordering",id:"string-ordering",level:3},{value:"HTTP Clients",id:"http-clients",level:3},{value:"Generating JSON",id:"generating-json",level:3},{value:"Parsing JSON",id:"parsing-json",level:3},{value:"HTTP stack",id:"http-stack",level:3},{value:"Testing changes",id:"testing-changes",level:2},{value:"Operational changes",id:"operational-changes",level:2},{value:"Documentation changes",id:"documentation-changes",level:2},{value:"Contributing changes",id:"contributing-changes",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"darklang-release-2",children:"Darklang Release 2"})}),"\n",(0,s.jsx)(n.p,{children:"June 6th, 2022"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["See the ",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/darklang-release-3/",children:"blog post"})," for further\ndiscussion."]})}),"\n",(0,s.jsxs)(n.p,{children:["Darklang Release 2 is the culmination of 20 months work of rewriting the backend\nfrom OCaml to F#. This was done to give us more productivity by allowing us use\nmore 3rd party SDKs, to solve operational issues, and to make it easier to\ncontribute. Our reasons for making the change were discussed at the time:\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/new-backend-fsharp/",children:"1"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/why-dark-didnt-choose-rust/",children:"2"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/leaving-ocaml/",children:"3"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The editor backend was fully migrated by April 2nd."}),"\n",(0,s.jsx)(n.li,{children:"HTTP backends (for builtwithdark.com) were finished converting on May 3rd."}),"\n",(0,s.jsx)(n.li,{children:"The migration to the new queues was fully converted on May 27th."}),"\n",(0,s.jsx)(n.li,{children:"The execution engine in the editor was switched over on June 5th."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The change was documented in a series of blog posts:\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/hows-the-dark-rewrite-going/",children:"1"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/changes-the-the-dark-rewrite/",children:"2"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/optimizing-tasks-in-fsharp/",children:"3"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/benchmarking-fsharp6-tasks/",children:"4"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/darklang-year-in-review-2021/",children:"5"}),",\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/try-out-the-new-darklang-backend/",children:"6"}),", and\n",(0,s.jsx)(n.a,{href:"https://blog.darklang.com/backend-rewrite-complete/",children:"7"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Thanks to everyone who contributed, including\n",(0,s.jsx)(n.a,{href:"https://github.com/Athinanarof",children:"Araceli S\xe1nchez"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/levlaz",children:"Lev Lazinskiy"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/mariajdab",children:"Mar\xeda Jos\xe9 D\xe1vila"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/mjeffryes",children:"Matthew Jeffryes"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/jwalter",children:"jwalter"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/danicampagna",children:"Daniela Campagna"}),",\n",(0,s.jsx)(n.a,{href:"https://github.com/sxmanton",children:"Sean Manton"}),", and especially\n",(0,s.jsx)(n.a,{href:"https://github.com/stachudotnet",children:"Stachu Korick"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"major-changes",children:"Major changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Darklang's implementation is now asynchronous, meaning that your programs will\nno longer be stuck behind other users' programs making HTTP or DB calls. This\nwas a major source of slow Dark programs experienced by most users."}),"\n",(0,s.jsx)(n.p,{children:"As well as massively reducing latency for programs written in Dark, the editor\nnow loads much faster."}),"\n",(0,s.jsx)(n.p,{children:"We have also switched from dozens of tiny machines to a smaller number of much\nmore powerful machines. This makes your programs run faster on average, even\nwhen accounting for the switch to an asynchronous implementation."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You can now put a lambda in a variable and pipe into it."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Most error messages are improved, especially for bad input."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"The queues have been rewritten and should not longer suffer from the old\nsources of occasional downtime and slow-down."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"During a deploy of the Dark service, cron jobs no longer run the risk of\nrunning twice."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["There is now a ",(0,s.jsx)(n.a,{href:"https://status.darklang.com",children:"Status page"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Dark's internal firewalls have been significantly improved"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Several bottlenecks to outbound HTTP requests have been identified and removed"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String::length"})," is now ",(0,s.jsx)(n.code,{children:"O(1)"})," instead of ",(0,s.jsx)(n.code,{children:"O(N)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"JSON output is now significantly faster"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When reading strings from a user, the string is only passed over once."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Traces are now stored in the background, after a request has completed,\ngreatly reducing response time on HTTP requests to Dark programs."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Dark has moved to more powerful cloud machines, going from Google' Cloud's\ndeprecated N1 machines to extremely powerful T2D machines (2.3x faster)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The rewrite also addressed some underlying issues that will come out in new\nfeatures soon, including a better type system, support for characters and\ntuples, fixes for poor behavior in Date and String functions, and more. These\nissues are tracked in our new\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/projects/1#column-15173588",children:"project tracker"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"error-messages",children:"Error messages"}),"\n",(0,s.jsx)(n.p,{children:"All error messages have been renovated, attempting to make them more consistent\nand to reuse error message machinery. As a result, a majority of Dark error\nmessages have changed. If you were relying on the explicit format of a Dark\nlanguage or StdLib error message, expect that it will be different."}),"\n",(0,s.jsx)(n.p,{children:"If you do any error handling which relies specifically on the text of an error\nmessage coming from Dark, we recommend you no longer do that, and just use the\npresence of the error instead of the text."}),"\n",(0,s.jsx)(n.p,{children:"There are two places in Dark which use string error messages:"}),"\n",(0,s.jsxs)(n.h4,{id:"resulterrors",children:[(0,s.jsx)(n.code,{children:"Result.Error"}),"s"]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"Error"})," enum (referred to as ",(0,s.jsx)(n.code,{children:"Result.Error"})," below for clarity), will contain\na string error in most cases, which you might be using directly or indirectly."]}),"\n",(0,s.jsxs)(n.p,{children:["You might be accessing ",(0,s.jsx)(n.code,{children:"Result.Error"}),"s and their text contents directly using\nthe ",(0,s.jsx)(n.code,{children:"match"})," statement."]}),"\n",(0,s.jsxs)(n.p,{children:["You might also be accessing their text contents indirectly, using ",(0,s.jsx)(n.code,{children:"toString"}),", or\nother stringifying functions, such as ",(0,s.jsx)(n.code,{children:"toString"}),", ",(0,s.jsx)(n.code,{children:"JSON::"})," functions and\n",(0,s.jsx)(n.code,{children:"HTTPClient::"})," functions. This is only true if you taken the function returning\nthe ",(0,s.jsx)(n.code,{children:"Result.Error"})," off the error rail. This text may also make it to your\nweb/mobile clients or API consumers."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Result.Error"}),"s returned via a HTTP handler are not presented to the user, so\ntext cannot leak that way."]}),"\n",(0,s.jsx)(n.h4,{id:"runtime-errors",children:"Runtime errors"}),"\n",(0,s.jsx)(n.p,{children:"Runtime errors (including type errors) are not accessible via Dark programs, and\nwill always terminate the Dark program when they are accessed. As a result, the\ntext of any runtime error should not be accessible to your programs or your\nusers."}),"\n",(0,s.jsx)(n.h2,{id:"minor-improvements-and-fixes",children:"Minor improvements and fixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark used to return the ",(0,s.jsx)(n.code,{children:"Access-Control-Allow-Origin"})," header in lower-case, it\nis now returned in mixed case."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When making a web request to your Dark application, if you did not specific a\n",(0,s.jsx)(n.code,{children:"user-agent"})," header, Dark used to add a ",(0,s.jsx)(n.code,{children:"user-agent"})," header of\n",(0,s.jsx)(n.code,{children:"ocaml-cohttp/1.2.0"}),". We no longer add this header."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When making a web request to your Dark application with a ",(0,s.jsx)(n.code,{children:"content-type"}),"\nheader of ",(0,s.jsx)(n.code,{children:"text/ping"}),", Dark used to ignore the code and immediately return a\nresponse of status code 418. It now processes the request instead."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"HttpClient::*"})," functions called with usernames and passwords in the URL can\nnow support arbitrary UTF-8 (in the past, Unicode was not supported.)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"X509::pemCertificatePublicKeys"})," used to only work for RSA keys. It now also\nsupports DSA and ECDSA keys. The old version would read ECDSA keys and return\nan incorrect answer - it now returns a correct answer."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String::split"})," would fail if the 2nd argument was ",(0,s.jsx)(n.code,{children:'""'})," and the first argument\nwas a complex Unicode character, such as ",(0,s.jsx)(n.code,{children:'String::split "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f\u200d\ufe0f\ud83c\uddf5\ud83c\uddf7" ""'}),". This\nis now split correctly."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"String.trim"}),", ",(0,s.jsx)(n.code,{children:"String::trimEnd"})," and ",(0,s.jsx)(n.code,{children:"String::trimStart"})," worked incorrectly in\nsome Unicode situations, they now work correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"breaking-changes",children:"Breaking changes"}),"\n",(0,s.jsx)(n.p,{children:"These breaking changes were documented and announced many months in advance of\nswitching over to the new version of Darklang. We also very careful deployed the\nnew code, watching for suspicious changes in any Dark programs that were\nrunning. In the rare case where something went awry, we contacted the users and\nworked with them to ensure a seamless transition."}),"\n",(0,s.jsx)(n.h3,{id:"string-casing",children:"String casing"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"String::toLowercase_v0"})," and ",(0,s.jsx)(n.code,{children:"String::toUppercase_v0"})," worked correctly in the\nold version of Dark, for all unicode. In the new version, the library we are\nusing does not correctly handle some case changes, instead keeping the\noriginal character. This happens when the replacement is a different length\nthan the character being replaced (for example, ",(0,s.jsx)(n.code,{children:'"\u0587"'})," should be ",(0,s.jsx)(n.code,{children:'"\u0535\u0552"'})," when\nconverted to upper case, which the old version did correctly and the new\nversion does not). We plan to fix this at a later point."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"string-ordering",children:"String ordering"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Functions whose output relies on the internal ordering of a ",(0,s.jsx)(n.code,{children:"Dict"})," may have\ndifferent outputs, specifically, the output Lists may be in a different order.\nExamples include ",(0,s.jsx)(n.code,{children:"Dict::keys"}),", ",(0,s.jsx)(n.code,{children:"Dict::values"}),", and ",(0,s.jsx)(n.code,{children:"Dict::toList"})," which return\n",(0,s.jsx)(n.code,{children:"List"}),"s of values which are ordered based on the internal ordering in the\noriginal ",(0,s.jsx)(n.code,{children:"Dict"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["When calling ",(0,s.jsx)(n.code,{children:"List::uniqueBy"}),", and there is a duplicate, the new version of\nDark may pick a different value for the duplicate. For example:"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dark",children:"List.uniqueBy_v0 [1;2;3;4] (fun x -> Int.divide_v0 x 2) = [ 1, 3, 4 ] // old Dark\nList.uniqueBy_v0 [1;2;3;4] (fun x -> Int.divide_v0 x 2) = [ 1, 2, 4 ] // new Dark\n"})}),"\n",(0,s.jsx)(n.h3,{id:"http-clients",children:"HTTP Clients"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"HttpClient::*"})," functions no longer support making requests with arbitrary\n",(0,s.jsx)(n.code,{children:"Content-Type"}),"s. They must now be\n",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type",children:"valid"}),",\nfor example ",(0,s.jsx)(n.code,{children:'"application/json"'})," or ",(0,s.jsx)(n.code,{children:'"application/json; charset=utf-8"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"generating-json",children:"Generating JSON"}),"\n",(0,s.jsx)(n.p,{children:"We have changed how JSON is generated in many cases. All the JSON generated by\nDark is now standards compliant, and uses a different formatting style."}),"\n",(0,s.jsxs)(n.p,{children:["In the old version of Dark, we would generate invalid JSON for the Float values\n",(0,s.jsx)(n.code,{children:"NaN"}),", ",(0,s.jsx)(n.code,{children:"Infinity"})," and ",(0,s.jsx)(n.code,{children:"-Infinity"}),". The old version of Dark generates them as\nbare identifiers, while the new version puts them in a string (e.g. ",(0,s.jsx)(n.code,{children:"NaN"})," vs\n",(0,s.jsx)(n.code,{children:'"NaN"'}),")."]}),"\n",(0,s.jsx)(n.p,{children:"This may occur in any of the places in which we generate JSON, which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"when responding to a HTTP request in the HTTP framework"}),"\n",(0,s.jsxs)(n.li,{children:["when making a request with ",(0,s.jsx)(n.code,{children:"HttpClient"})," (any version)"]}),"\n",(0,s.jsxs)(n.li,{children:["when calling any of:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"Dict::toJson_v0"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Object::toJson_v1"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Object::toJson_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"Twilio::sendText_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Twilio::sendText_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Note that the following ",(0,s.jsx)(n.code,{children:"JWT"})," functions do not use this new behavior, and should\nhave the exact same behavior as before, including:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JWT::signAndEncode_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JWT::signAndEncode_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JWT::signAndEncodeWithHeaders_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JWT::signAndEncodeWithHeaders_v1"})}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"parsing-json",children:"Parsing JSON"}),"\n",(0,s.jsx)(n.p,{children:"When parsing JSON, we no longer accept the following invalid JSON:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["bare field names, such as in ",(0,s.jsx)(n.code,{children:"{ id : 5 }"}),". You need to quote field names:\n",(0,s.jsx)(n.code,{children:'{ "id": 5 }'})]}),"\n",(0,s.jsx)(n.li,{children:"newlines and invalid bytes in JSON strings"}),"\n",(0,s.jsxs)(n.li,{children:["the bare identifiers ",(0,s.jsx)(n.code,{children:"NaN"}),", ",(0,s.jsx)(n.code,{children:"Infinity"})," and ",(0,s.jsx)(n.code,{children:"-Infinity"})," are no longer parsed\ninto valid floats (note that the old version of Dark might have generated JSON\nwith these values in it)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Dark now also allows parsing 64-bit integers (as opposed to 63-bit integers\nbefore)."}),"\n",(0,s.jsx)(n.p,{children:"Dark parses JSON:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"when receiving a HTTP request in the HTTP framework"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["when receiving a response to a request made with ",(0,s.jsx)(n.code,{children:"HttpClient"})," (any version)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"when calling any of:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"JSON::parse_v1"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::parse_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::read_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"JSON::read_v0"})," (",(0,s.jsx)(n.em,{children:"deprecated"}),")"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Note that ",(0,s.jsx)(n.code,{children:"JWT::verifyAndExtract_v0"})," and ",(0,s.jsx)(n.code,{children:"JWT::verifyAndExtract_v1"})," are not\naffected by this change, as they have been kept deliberately compatible with the\nold versions."]}),"\n",(0,s.jsx)(n.h3,{id:"http-stack",children:"HTTP stack"}),"\n",(0,s.jsxs)(n.p,{children:["Dark has switched to using Kestrel, a high-performance HTTP server from .NET,\nfor its HTTP server. There are some differences between the new Kestrel-based\nserver and the previous OCaml ",(0,s.jsx)(n.code,{children:"cohttp"}),"-based server:"]}),"\n",(0,s.jsx)(n.p,{children:"Large differences:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark programs can no longer set the HTTP ",(0,s.jsx)(n.code,{children:"Content-Length"})," header and it will\nbe set automatically. A ",(0,s.jsx)(n.code,{children:"Content-Length"})," header will be ignored if provided\nvia ",(0,s.jsx)(n.code,{children:"Http::response"})," or similar functions."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Dark is now less lenient to receiving incorrect ",(0,s.jsx)(n.code,{children:"Content-Length"})," headers. If\nthe data sent does not match the expected ",(0,s.jsx)(n.code,{children:"Content-Length"}),", the HTTP server\nwill return a 400 Bad Request error. Omitting the ",(0,s.jsx)(n.code,{children:"Content-Length"})," header is\nstill OK."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"JSON returned from HTTP requests is now formatted differently, as discussed\nabove."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Minor differences:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["When making HTTP requests to Dark:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Clients must send at least 256 bytes every 5 seconds or be timed-out"}),"\n",(0,s.jsx)(n.li,{children:"All headers must be sent in first 10 seconds"}),"\n",(0,s.jsx)(n.li,{children:"There must be fewer than 100 headers and they must fit in 32KB"}),"\n",(0,s.jsx)(n.li,{children:"The maximum size of HTTP requests to Dark is 10MB"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["HTTP responses sent by Dark","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Headers will be returned in a different order"}),"\n",(0,s.jsx)(n.li,{children:"Headers are not always lowercase anymore"}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"Date"})," header is now always present"]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"Server"})," header is now ",(0,s.jsx)(n.code,{children:"darklang"})," and always present"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"testing-changes",children:"Testing changes"}),"\n",(0,s.jsx)(n.p,{children:"We have gone from about 250 backend tests to over 5,000. We now have custom test\nframeworks for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/execution",children:"language and standard library testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/httphandler",children:"HTTP server testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/tree/main/backend/testfiles/httpclient",children:"Testing HTTP clients"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/stable-dark/tree/main/backend/tests/FuzzTests",children:"Fuzz testing"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/stable-dark/tree/main/integration-tests",children:"Integration tests"}),"\nwere ported to ",(0,s.jsx)(n.a,{href:"https://playwright.dev/",children:"Playwright"}),", from TestCafe. They now\nrun much faster and are somewhat easier to write."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"operational-changes",children:"Operational changes"}),"\n",(0,s.jsx)(n.p,{children:"Behind the scenes, Dark has greatly improved its operations."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Switched to massively more powerful servers (requests now get 2 CPUs of a\n",(0,s.jsx)(n.a,{href:"https://cloud.google.com/blog/products/compute/compute-engine-tau-t2d-vms-now-available-for-scale-out-workloads",children:"Google Cloud T2D"}),",\nvs 0.1 CPUs of a n1d -- T2Ds are about 2.3x more powerful than N1Ds)"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Separated the servers used by the Darklang editor from the ones running\nproduction applications."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Massively increased use of ",(0,s.jsx)(n.a,{href:"https://honeycomb.io",children:"observability"})," and error\ntracking to catch errors and customer issues"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Moved queues from running in the database (often taking over 50% of the CPU,\nto relying on our cloud vendor (Google PubSub). Also greatly increased\nreliability of the queues."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Nodes are now autoscaled, leading to significant cost savings."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Updated to latest version of Kubernetes, ",(0,s.jsx)(n.code,{children:"cert-manager"})," (which powers our\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/how-to/custom-domains",children:"custom domains"})," feature),\nnginx, and other tools that we use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added internal ",(0,s.jsx)(n.a,{href:"https://launchdarkly.com",children:"feature flagging"})," to give us more\ncontrol over how our infrastructure runs in production"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Significantly increased use of Kubernetes' security features, in particular\ninternal firewalls."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Standardized our production deployment process using a tool we wrote called\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/blob/8082df91676de2f26a0661bf20827a60976bb3c0/scripts/deployment/shipit",children:"shipit"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Removed nginx from our builtwithdark.com backends"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Move migrations out from startup code"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"All certs except darksa.com and darkstaticassets.com are now managed\nautomatically"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"documentation-changes",children:"Documentation changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"moved docs to docs.darklang.com"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/docs/pull/220",children:"refactored docs"})," to use the Divio\ndocumentation system, categorizing all docs into Tutorials, Reference,\nHow-tos, Walk-throughs and Discussion."]}),"\n",(0,s.jsx)(n.li,{children:"fixed all links"}),"\n",(0,s.jsxs)(n.li,{children:["redo the\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/discussion/error-handling",children:"Error Rail discussion"})]}),"\n",(0,s.jsxs)(n.li,{children:["add a discussion of\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/discussion/queues",children:"how the Queues work"})]}),"\n",(0,s.jsxs)(n.li,{children:["improved and expanded\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/reference/keyboard-mapping",children:"keyboard shortcuts docs"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"contributing-changes",children:"Contributing changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/blob/main/CODING-GUIDE.md",children:"coding guidelines"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Added significant documentation, especially READMEs and design decisions,\nthroughout the ",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark",children:"darklang repo"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Moved 99% of project collaboration to our\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark",children:"public GitHub"})," and\n",(0,s.jsx)(n.a,{href:"https://darklang.com/discord-invite",children:"public community chat"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["ported our\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/contributing/rescript-and-fsharp-for-dark-developers",children:"contributor guides"}),"\nto F#"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>d});var s=r(96540);const i={},t=s.createContext(i);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1cc5ba5a.38af70d8.js b/assets/js/1cc5ba5a.fac5cb68.js similarity index 87% rename from assets/js/1cc5ba5a.38af70d8.js rename to assets/js/1cc5ba5a.fac5cb68.js index 38ebd1a52..3d04214c2 100644 --- a/assets/js/1cc5ba5a.38af70d8.js +++ b/assets/js/1cc5ba5a.fac5cb68.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7842],{40908:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const i={id:"custom-domains",title:"How to set up a Custom Domain",sidebar_label:"How to set up a custom domain"},a=void 0,r={id:"how-to/custom-domains",title:"How to set up a Custom Domain",description:"Your backend endpoints are always available at",source:"@site/docs-classic/how-to/custom-domains.md",sourceDirName:"how-to",slug:"/how-to/custom-domains",permalink:"/how-to/custom-domains",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/how-to/custom-domains.md",tags:[],version:"current",frontMatter:{id:"custom-domains",title:"How to set up a Custom Domain",sidebar_label:"How to set up a custom domain"},sidebar:"docs",previous:{title:"How to host Static Assets",permalink:"/how-to/static-assets"},next:{title:"How to work with CORS",permalink:"/how-to/cors"}},c={},d=[{value:"How to set it up",id:"how-to-set-it-up",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"I've set up a CNAME but I still don't see <your_canvas_name>.darkcustomdomain.com in the results from dig!",id:"ive-set-up-a-cname-but-i-still-dont-see-your_canvas_namedarkcustomdomaincom-in-the-results-from-dig",level:3},{value:"My DNS is set up correctly, but I'm getting an invalid certificate warning when trying to visit my custom domain via https",id:"my-dns-is-set-up-correctly-but-im-getting-an-invalid-certificate-warning-when-trying-to-visit-my-custom-domain-via-https",level:3}];function l(e){const o={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(o.p,{children:["Your backend endpoints are always available at\n",(0,t.jsx)(o.code,{children:".builtwithdark.com/*"}),"."]}),"\n",(0,t.jsxs)(o.p,{children:["If you'd like, you can additionally use a custom domain like\n",(0,t.jsx)(o.code,{children:"www.myawesomedarkservice.com"})," or ",(0,t.jsx)(o.code,{children:"api.myawesomedarkservice.com"})," to serve your\nendpoints!"]}),"\n",(0,t.jsxs)(o.p,{children:["We'll manage SSL for you - no need to buy your own certificate to make your site\nor service available over ",(0,t.jsx)(o.code,{children:"https"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"how-to-set-it-up",children:"How to set it up"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Set up a ",(0,t.jsx)(o.code,{children:"CNAME"})," record that points from your desired domain to\n",(0,t.jsx)(o.code,{children:".darkcustomdomain.com"}),". For example, if your canvas is\ncalled ",(0,t.jsx)(o.code,{children:"ellen-demo"}),", point your ",(0,t.jsx)(o.code,{children:"CNAME"})," at ",(0,t.jsx)(o.code,{children:"ellen-demo.darkcustomdomain.com"}),".\nThe specifics for this step depends on how you manage your DNS settings, but\nhere's what it might look like on Cloudflare:"]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"Setting a CNAME on Cloudflare",src:n(47733).Z+"",width:"2110",height:"630"})}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Note"}),": You ",(0,t.jsx)(o.em,{children:"cannot"})," use an apex domain like ",(0,t.jsx)(o.code,{children:"myawesomedarkservice.com"}),".\nUsing ",(0,t.jsx)(o.code,{children:"www.myawesomedarkservice.com"})," is the usual way, although you can use\n",(0,t.jsx)(o.code,{children:"app"}),", ",(0,t.jsx)(o.code,{children:"api"}),", or another subdomain instead of ",(0,t.jsx)(o.code,{children:"www"}),". This is because apex\n",(0,t.jsx)(o.code,{children:"CNAME"}),"s aren't supported by the DNS spec, and ",(0,t.jsx)(o.code,{children:"A"})," records remove some of our\noptions for providing stable and resilient infrastructure. You can read\n",(0,t.jsx)(o.a,{href:"https://www.netlify.com/blog/2017/02/28/to-www-or-not-www/",children:"this Netlify post"}),"\nfor more information."]}),"\n",(0,t.jsxs)(o.p,{children:["If you wish, you can additionally set up an ",(0,t.jsx)(o.code,{children:"A"})," record pointing the apex\n(e.g. ",(0,t.jsx)(o.code,{children:"myawesomedarkservice.com"}),") to ",(0,t.jsx)(o.code,{children:"35.227.208.117"}),". We cannot currently\nprovide an SSL cert for that, but we can redirect to your main subdomain\n(which is usually ",(0,t.jsx)(o.code,{children:"www"}),"). If your DNS provider supports ",(0,t.jsx)(o.code,{children:"ALIAS"})," records (like\n",(0,t.jsx)(o.code,{children:"CNAME"}),", but permitted on an apex), that also works - though again, for\nredirects, not SSL certs."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Double-check that DNS has resolved. One way to test this is with the ",(0,t.jsx)(o.code,{children:"dig"}),"\ntool on the command line. If everything is ready, you should see something\nlike this:"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-shell",children:" $dig api.myawesomedarkservice.com\n # ...\n ;; ANSWER SECTION:\n api.myawesomedarkservice.com. 300 IN CNAME ellen-demo.darkcustomdomain.com.\n ellen-demo.darkcustomdomain.com. 300 IN A 35.197.124.122\n # ...\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Another way to check is with a service like\n",(0,t.jsx)(o.a,{href:"https://dnschecker.org/",children:"https://dnschecker.org/"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Once DNS resolves, ",(0,t.jsx)(o.a,{href:"/reference/support",children:"contact us"})," with your domain and\ncanvas, and we'll set up an SSL cert and the appropriate redirects from\n",(0,t.jsx)(o.code,{children:"http"})," to ",(0,t.jsx)(o.code,{children:"https"})," on our end."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsxs)(o.h3,{id:"ive-set-up-a-cname-but-i-still-dont-see-your_canvas_namedarkcustomdomaincom-in-the-results-from-dig",children:["I've set up a CNAME but I still don't see ",(0,t.jsx)(o.code,{children:".darkcustomdomain.com"})," in the results from ",(0,t.jsx)(o.code,{children:"dig"}),"!"]}),"\n",(0,t.jsx)(o.p,{children:"We've seen this happen for develops using proxies like Cloudflare in front of\ntheir domains. For example, you might see:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-shell",children:"$ dig api.myawesomedarkservice.com\n# ...\n;; ANSWER SECTION:\napi.myawesomedarkservice.com. 300 IN A 104.24.118.127\napi.myawesomedarkservice.com. 300 IN A 104.24.119.127\n# ...\n"})}),"\n",(0,t.jsxs)(o.p,{children:['To resolve this, turn off the proxy. On Cloudflare, you can press this button to\nswitch from "Proxied" to "DNS only" mode:\n',(0,t.jsx)(o.img,{alt:"Turning off the Cloudflare proxy in favor of "DNS only"",src:n(54878).Z+"",width:"2086",height:"492"})]}),"\n",(0,t.jsxs)(o.h3,{id:"my-dns-is-set-up-correctly-but-im-getting-an-invalid-certificate-warning-when-trying-to-visit-my-custom-domain-via-https",children:["My DNS is set up correctly, but I'm getting an invalid certificate warning when trying to visit my custom domain via ",(0,t.jsx)(o.code,{children:"https"})]}),"\n",(0,t.jsxs)(o.p,{children:["If this happens we likely haven't set up an SSL certificate for you yet (see\nstep 3 above). In any case, please ",(0,t.jsx)(o.a,{href:"/reference/support",children:"contact us"})," with your\ndomain and canvas."]})]})}function h(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},54878:(e,o,n)=>{n.d(o,{Z:()=>t});const t=n.p+"assets/images/cloudflare-proxy-a23497061d4f2d17ff7ae4051b1f3bdd.png"},47733:(e,o,n)=>{n.d(o,{Z:()=>t});const t=n.p+"assets/images/cname-example-2f957d26fad36f17c2a324c89da878df.png"},11151:(e,o,n)=>{n.d(o,{Z:()=>r,a:()=>a});var t=n(67294);const s={},i=t.createContext(s);function a(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7778],{56010:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var t=n(74848),s=n(28453);const i={id:"custom-domains",title:"How to set up a Custom Domain",sidebar_label:"How to set up a custom domain"},r=void 0,a={id:"how-to/custom-domains",title:"How to set up a Custom Domain",description:"Your backend endpoints are always available at",source:"@site/docs-classic/how-to/custom-domains.md",sourceDirName:"how-to",slug:"/how-to/custom-domains",permalink:"/how-to/custom-domains",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/how-to/custom-domains.md",tags:[],version:"current",frontMatter:{id:"custom-domains",title:"How to set up a Custom Domain",sidebar_label:"How to set up a custom domain"},sidebar:"docs",previous:{title:"How to host Static Assets",permalink:"/how-to/static-assets"},next:{title:"How to work with CORS",permalink:"/how-to/cors"}},c={},d=[{value:"How to set it up",id:"how-to-set-it-up",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"I've set up a CNAME but I still don't see <your_canvas_name>.darkcustomdomain.com in the results from dig!",id:"ive-set-up-a-cname-but-i-still-dont-see-your_canvas_namedarkcustomdomaincom-in-the-results-from-dig",level:3},{value:"My DNS is set up correctly, but I'm getting an invalid certificate warning when trying to visit my custom domain via https",id:"my-dns-is-set-up-correctly-but-im-getting-an-invalid-certificate-warning-when-trying-to-visit-my-custom-domain-via-https",level:3}];function l(e){const o={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(o.p,{children:["Your backend endpoints are always available at\n",(0,t.jsx)(o.code,{children:".builtwithdark.com/*"}),"."]}),"\n",(0,t.jsxs)(o.p,{children:["If you'd like, you can additionally use a custom domain like\n",(0,t.jsx)(o.code,{children:"www.myawesomedarkservice.com"})," or ",(0,t.jsx)(o.code,{children:"api.myawesomedarkservice.com"})," to serve your\nendpoints!"]}),"\n",(0,t.jsxs)(o.p,{children:["We'll manage SSL for you - no need to buy your own certificate to make your site\nor service available over ",(0,t.jsx)(o.code,{children:"https"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"how-to-set-it-up",children:"How to set it up"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Set up a ",(0,t.jsx)(o.code,{children:"CNAME"})," record that points from your desired domain to\n",(0,t.jsx)(o.code,{children:".darkcustomdomain.com"}),". For example, if your canvas is\ncalled ",(0,t.jsx)(o.code,{children:"ellen-demo"}),", point your ",(0,t.jsx)(o.code,{children:"CNAME"})," at ",(0,t.jsx)(o.code,{children:"ellen-demo.darkcustomdomain.com"}),".\nThe specifics for this step depends on how you manage your DNS settings, but\nhere's what it might look like on Cloudflare:"]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"Setting a CNAME on Cloudflare",src:n(39354).A+"",width:"2110",height:"630"})}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Note"}),": You ",(0,t.jsx)(o.em,{children:"cannot"})," use an apex domain like ",(0,t.jsx)(o.code,{children:"myawesomedarkservice.com"}),".\nUsing ",(0,t.jsx)(o.code,{children:"www.myawesomedarkservice.com"})," is the usual way, although you can use\n",(0,t.jsx)(o.code,{children:"app"}),", ",(0,t.jsx)(o.code,{children:"api"}),", or another subdomain instead of ",(0,t.jsx)(o.code,{children:"www"}),". This is because apex\n",(0,t.jsx)(o.code,{children:"CNAME"}),"s aren't supported by the DNS spec, and ",(0,t.jsx)(o.code,{children:"A"})," records remove some of our\noptions for providing stable and resilient infrastructure. You can read\n",(0,t.jsx)(o.a,{href:"https://www.netlify.com/blog/2017/02/28/to-www-or-not-www/",children:"this Netlify post"}),"\nfor more information."]}),"\n",(0,t.jsxs)(o.p,{children:["If you wish, you can additionally set up an ",(0,t.jsx)(o.code,{children:"A"})," record pointing the apex\n(e.g. ",(0,t.jsx)(o.code,{children:"myawesomedarkservice.com"}),") to ",(0,t.jsx)(o.code,{children:"35.227.208.117"}),". We cannot currently\nprovide an SSL cert for that, but we can redirect to your main subdomain\n(which is usually ",(0,t.jsx)(o.code,{children:"www"}),"). If your DNS provider supports ",(0,t.jsx)(o.code,{children:"ALIAS"})," records (like\n",(0,t.jsx)(o.code,{children:"CNAME"}),", but permitted on an apex), that also works - though again, for\nredirects, not SSL certs."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Double-check that DNS has resolved. One way to test this is with the ",(0,t.jsx)(o.code,{children:"dig"}),"\ntool on the command line. If everything is ready, you should see something\nlike this:"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-shell",children:" $dig api.myawesomedarkservice.com\n # ...\n ;; ANSWER SECTION:\n api.myawesomedarkservice.com. 300 IN CNAME ellen-demo.darkcustomdomain.com.\n ellen-demo.darkcustomdomain.com. 300 IN A 35.197.124.122\n # ...\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Another way to check is with a service like\n",(0,t.jsx)(o.a,{href:"https://dnschecker.org/",children:"https://dnschecker.org/"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["Once DNS resolves, ",(0,t.jsx)(o.a,{href:"/reference/support",children:"contact us"})," with your domain and\ncanvas, and we'll set up an SSL cert and the appropriate redirects from\n",(0,t.jsx)(o.code,{children:"http"})," to ",(0,t.jsx)(o.code,{children:"https"})," on our end."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsxs)(o.h3,{id:"ive-set-up-a-cname-but-i-still-dont-see-your_canvas_namedarkcustomdomaincom-in-the-results-from-dig",children:["I've set up a CNAME but I still don't see ",(0,t.jsx)(o.code,{children:".darkcustomdomain.com"})," in the results from ",(0,t.jsx)(o.code,{children:"dig"}),"!"]}),"\n",(0,t.jsx)(o.p,{children:"We've seen this happen for develops using proxies like Cloudflare in front of\ntheir domains. For example, you might see:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-shell",children:"$ dig api.myawesomedarkservice.com\n# ...\n;; ANSWER SECTION:\napi.myawesomedarkservice.com. 300 IN A 104.24.118.127\napi.myawesomedarkservice.com. 300 IN A 104.24.119.127\n# ...\n"})}),"\n",(0,t.jsxs)(o.p,{children:['To resolve this, turn off the proxy. On Cloudflare, you can press this button to\nswitch from "Proxied" to "DNS only" mode:\n',(0,t.jsx)(o.img,{alt:"Turning off the Cloudflare proxy in favor of "DNS only"",src:n(48167).A+"",width:"2086",height:"492"})]}),"\n",(0,t.jsxs)(o.h3,{id:"my-dns-is-set-up-correctly-but-im-getting-an-invalid-certificate-warning-when-trying-to-visit-my-custom-domain-via-https",children:["My DNS is set up correctly, but I'm getting an invalid certificate warning when trying to visit my custom domain via ",(0,t.jsx)(o.code,{children:"https"})]}),"\n",(0,t.jsxs)(o.p,{children:["If this happens we likely haven't set up an SSL certificate for you yet (see\nstep 3 above). In any case, please ",(0,t.jsx)(o.a,{href:"/reference/support",children:"contact us"})," with your\ndomain and canvas."]})]})}function h(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},48167:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/cloudflare-proxy-a23497061d4f2d17ff7ae4051b1f3bdd.png"},39354:(e,o,n)=>{n.d(o,{A:()=>t});const t=n.p+"assets/images/cname-example-2f957d26fad36f17c2a324c89da878df.png"},28453:(e,o,n)=>{n.d(o,{R:()=>r,x:()=>a});var t=n(96540);const s={},i=t.createContext(s);function r(e){const o=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e1670cf.55a6b8bd.js b/assets/js/1e1670cf.93c2efe9.js similarity index 94% rename from assets/js/1e1670cf.55a6b8bd.js rename to assets/js/1e1670cf.93c2efe9.js index 452254981..0c42f04de 100644 --- a/assets/js/1e1670cf.55a6b8bd.js +++ b/assets/js/1e1670cf.93c2efe9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9924],{35794:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=t(85893),o=t(11151);const i={title:"If you don't know our stack (F#)"},r=void 0,a={id:"contributing/if-you-dont-know-our-stack",title:"If you don't know our stack (F#)",description:"F# can be a little bit daunting, but even if you don't know them, there are a",source:"@site/docs-classic/contributing/if-you-dont-know-our-stack.md",sourceDirName:"contributing",slug:"/contributing/if-you-dont-know-our-stack",permalink:"/contributing/if-you-dont-know-our-stack",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/contributing/if-you-dont-know-our-stack.md",tags:[],version:"current",frontMatter:{title:"If you don't know our stack (F#)"},sidebar:"Contributing",previous:{title:"Your next contribution",permalink:"/contributing/next-contribution"},next:{title:"Adding a built-in function",permalink:"/contributing/adding-a-function"}},l={},u=[{value:"Other languages",id:"other-languages",level:2},{value:"Non-code",id:"non-code",level:2},{value:"Writing docs",id:"writing-docs",level:2},{value:"Reporting bugs",id:"reporting-bugs",level:2},{value:"Fluid editor",id:"fluid-editor",level:3},{value:"Better error messages",id:"better-error-messages",level:3},{value:"Learning F#",id:"learning-f",level:2}];function d(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"F# can be a little bit daunting, but even if you don't know them, there are a\nbunch of ways to get involved."}),"\n",(0,s.jsx)(n.h2,{id:"other-languages",children:"Other languages"}),"\n",(0,s.jsx)(n.p,{children:"Darklang has a number of different languages, including Rust, bash, Python,\nJavascript, HTML, and CSS."}),"\n",(0,s.jsx)(n.p,{children:"We have issues in each of these:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Ajavascript",children:"Javascript"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Abash",children:"Bash"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"non-code",children:"Non-code"}),"\n",(0,s.jsxs)(n.p,{children:["Lots of times we don't know what to do, and it's extremely valuable to have\nsomeone look into the problem and document what's happening. These issues are\nlabeled\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Ainvestigation",children:'"investigation"'}),"."]}),"\n",(0,s.jsxs)(n.p,{children:['Similar, the\n"',(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Aneeds-thought",children:"needs thought"}),'"\nissue is about designing thoughtful solutions to sticky problems.']}),"\n",(0,s.jsx)(n.h2,{id:"writing-docs",children:"Writing docs"}),"\n",(0,s.jsxs)(n.p,{children:["There are lots of docs that would be very helpful to write. If you look at the\n",(0,s.jsx)(n.a,{href:"https://darklang.com/docs",children:"current docs"}),", there are docs that would be useful\nthat you can write as a non-expert."]}),"\n",(0,s.jsxs)(n.p,{children:["There are a bunch of ",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/category/tutorial",children:"tutorials"}),"\nfor different technologies, frameworks and libraries; writing one for another\nwould be extremely useful. It would also allow you to write up how Darklang\ncould be improved to support that technology. You can even make\n",(0,s.jsx)(n.a,{href:"https://www.youtube.com/c/Darklang/videos",children:"video tutorials"}),"!"]}),"\n",(0,s.jsxs)(n.p,{children:["Similarly, we have some guides for people learning Darklang who know other\nlanguages. Adding another language would be wonderful. See for example the\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/reference/cheatsheets/python-cheatsheet",children:"Python version"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"reporting-bugs",children:"Reporting bugs"}),"\n",(0,s.jsxs)(n.p,{children:["Darklang has many bugs and problems: documenting them for other contributors to\nfix would be very useful. Small, compact descriptions with instructions to\nreproduce the bugs are very welcome. You can add them to the\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues",children:"issue tracker"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"fluid-editor",children:"Fluid editor"}),"\n",(0,s.jsx)(n.p,{children:'The "fluid" editor is how you write code in Darklang. It is still often the case\nthat you get an unexpected result when you type something: documenting\nindividual cases as issues is very valuable!'}),"\n",(0,s.jsx)(n.h3,{id:"better-error-messages",children:"Better error messages"}),"\n",(0,s.jsx)(n.p,{children:"Darklang's error messages are not as good as they could be, and this is a real\nproblem for users learning the language the first time. Documenting a bad error\nmessage, especially with a suggested better version, is a really useful\ncontribution."}),"\n",(0,s.jsx)(n.h2,{id:"learning-f",children:"Learning F#"}),"\n",(0,s.jsx)(n.p,{children:"Darklang is almost everybody's first F# project. So if you don't know these two\nsimilar languages, join the club - we all learned as we contributed to Darklang.\nFortunately, they are very similar to Darklang."}),"\n",(0,s.jsx)(n.p,{children:"There are a number of resources to help as well:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing/adding-your-first-test",children:"A guided walkthrough of making your first PR"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aopen+is%3Aissue+label%3Agood-first-bug",children:"good first bugs"}),"\nassume you don't know anything about F#"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Also, some bugs, especially our\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aopen+is%3Aissue+label%3Ainitiative",children:"initiatives"}),",\nrequire almost no F# knowledge, despite the fact that they are in those parts of\nthe codebase. People with no prior exposure to them should be able to make a\nuseful change to one of these in very little time."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5306],{27790:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=t(74848),o=t(28453);const i={title:"If you don't know our stack (F#)"},r=void 0,a={id:"contributing/if-you-dont-know-our-stack",title:"If you don't know our stack (F#)",description:"F# can be a little bit daunting, but even if you don't know them, there are a",source:"@site/docs-classic/contributing/if-you-dont-know-our-stack.md",sourceDirName:"contributing",slug:"/contributing/if-you-dont-know-our-stack",permalink:"/contributing/if-you-dont-know-our-stack",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/contributing/if-you-dont-know-our-stack.md",tags:[],version:"current",frontMatter:{title:"If you don't know our stack (F#)"},sidebar:"Contributing",previous:{title:"Your next contribution",permalink:"/contributing/next-contribution"},next:{title:"Adding a built-in function",permalink:"/contributing/adding-a-function"}},l={},u=[{value:"Other languages",id:"other-languages",level:2},{value:"Non-code",id:"non-code",level:2},{value:"Writing docs",id:"writing-docs",level:2},{value:"Reporting bugs",id:"reporting-bugs",level:2},{value:"Fluid editor",id:"fluid-editor",level:3},{value:"Better error messages",id:"better-error-messages",level:3},{value:"Learning F#",id:"learning-f",level:2}];function d(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"F# can be a little bit daunting, but even if you don't know them, there are a\nbunch of ways to get involved."}),"\n",(0,s.jsx)(n.h2,{id:"other-languages",children:"Other languages"}),"\n",(0,s.jsx)(n.p,{children:"Darklang has a number of different languages, including Rust, bash, Python,\nJavascript, HTML, and CSS."}),"\n",(0,s.jsx)(n.p,{children:"We have issues in each of these:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Ajavascript",children:"Javascript"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Abash",children:"Bash"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"non-code",children:"Non-code"}),"\n",(0,s.jsxs)(n.p,{children:["Lots of times we don't know what to do, and it's extremely valuable to have\nsomeone look into the problem and document what's happening. These issues are\nlabeled\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Ainvestigation",children:'"investigation"'}),"."]}),"\n",(0,s.jsxs)(n.p,{children:['Similar, the\n"',(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aissue+is%3Aopen+label%3Aneeds-thought",children:"needs thought"}),'"\nissue is about designing thoughtful solutions to sticky problems.']}),"\n",(0,s.jsx)(n.h2,{id:"writing-docs",children:"Writing docs"}),"\n",(0,s.jsxs)(n.p,{children:["There are lots of docs that would be very helpful to write. If you look at the\n",(0,s.jsx)(n.a,{href:"https://darklang.com/docs",children:"current docs"}),", there are docs that would be useful\nthat you can write as a non-expert."]}),"\n",(0,s.jsxs)(n.p,{children:["There are a bunch of ",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/category/tutorial",children:"tutorials"}),"\nfor different technologies, frameworks and libraries; writing one for another\nwould be extremely useful. It would also allow you to write up how Darklang\ncould be improved to support that technology. You can even make\n",(0,s.jsx)(n.a,{href:"https://www.youtube.com/c/Darklang/videos",children:"video tutorials"}),"!"]}),"\n",(0,s.jsxs)(n.p,{children:["Similarly, we have some guides for people learning Darklang who know other\nlanguages. Adding another language would be wonderful. See for example the\n",(0,s.jsx)(n.a,{href:"https://docs.darklang.com/reference/cheatsheets/python-cheatsheet",children:"Python version"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"reporting-bugs",children:"Reporting bugs"}),"\n",(0,s.jsxs)(n.p,{children:["Darklang has many bugs and problems: documenting them for other contributors to\nfix would be very useful. Small, compact descriptions with instructions to\nreproduce the bugs are very welcome. You can add them to the\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues",children:"issue tracker"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"fluid-editor",children:"Fluid editor"}),"\n",(0,s.jsx)(n.p,{children:'The "fluid" editor is how you write code in Darklang. It is still often the case\nthat you get an unexpected result when you type something: documenting\nindividual cases as issues is very valuable!'}),"\n",(0,s.jsx)(n.h3,{id:"better-error-messages",children:"Better error messages"}),"\n",(0,s.jsx)(n.p,{children:"Darklang's error messages are not as good as they could be, and this is a real\nproblem for users learning the language the first time. Documenting a bad error\nmessage, especially with a suggested better version, is a really useful\ncontribution."}),"\n",(0,s.jsx)(n.h2,{id:"learning-f",children:"Learning F#"}),"\n",(0,s.jsx)(n.p,{children:"Darklang is almost everybody's first F# project. So if you don't know these two\nsimilar languages, join the club - we all learned as we contributed to Darklang.\nFortunately, they are very similar to Darklang."}),"\n",(0,s.jsx)(n.p,{children:"There are a number of resources to help as well:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing/adding-your-first-test",children:"A guided walkthrough of making your first PR"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aopen+is%3Aissue+label%3Agood-first-bug",children:"good first bugs"}),"\nassume you don't know anything about F#"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Also, some bugs, especially our\n",(0,s.jsx)(n.a,{href:"https://github.com/darklang/dark/issues?q=is%3Aopen+is%3Aissue+label%3Ainitiative",children:"initiatives"}),",\nrequire almost no F# knowledge, despite the fact that they are in those parts of\nthe codebase. People with no prior exposure to them should be able to make a\nuseful change to one of these in very little time."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(96540);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2237.1cb5fda6.js b/assets/js/2237.1cb5fda6.js new file mode 100644 index 000000000..4204cecda --- /dev/null +++ b/assets/js/2237.1cb5fda6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2237],{23363:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var i=n(34164),o=n(21312),s=n(51107),r=n(74848);function a(e){var t=e.className;return(0,r.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},82237:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(96540);var i=n(21312),o=n(69024),s=n(41957),r=n(23363),a=n(74848);function d(){var e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.ce5e21e5.js b/assets/js/22dd74f7.ce5e21e5.js deleted file mode 100644 index d095d699d..000000000 --- a/assets/js/22dd74f7.ce5e21e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4980],{5904:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Overview of Darklang Classic","href":"/introduction","docId":"introduction","unlisted":false},{"type":"category","label":"Tutorial","items":[{"type":"link","label":"Your first Darklang application","href":"/tutorials/first-dark-application","docId":"tutorials/first-dark-application","unlisted":false},{"type":"link","label":"Create a HTTP handler","href":"/tutorials/create-http-handler","docId":"tutorials/create-http-handler","unlisted":false},{"type":"link","label":"Create a tool in a REPL","href":"/tutorials/create-tool-repl","docId":"tutorials/create-tool-repl","unlisted":false},{"type":"link","label":"Save data to a Datastore","href":"/tutorials/save-data-to-datastore","docId":"tutorials/save-data-to-datastore","unlisted":false},{"type":"link","label":"Create a daily job with a Cron handler","href":"/tutorials/create-daily-job-cron-handler","docId":"tutorials/create-daily-job-cron-handler","unlisted":false},{"type":"link","label":"Process background jobs in a Worker","href":"/tutorials/process-background-jobs-worker","docId":"tutorials/process-background-jobs-worker","unlisted":false},{"type":"link","label":"Extract code into a Function","href":"/tutorials/extract-function","docId":"tutorials/extract-function","unlisted":false},{"type":"link","label":"Call an external API","href":"/tutorials/call-external-api","docId":"tutorials/call-external-api","unlisted":false},{"type":"link","label":"Complete your first application","href":"/tutorials/complete-first-application","docId":"tutorials/complete-first-application","unlisted":false},{"type":"link","label":"Handle error messages with the Error Rail","href":"/tutorials/handle-error-errorrail","docId":"tutorials/handle-error-errorrail","unlisted":false},{"type":"link","label":"Next steps","href":"/tutorials/next-steps","docId":"tutorials/next-steps","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/tutorial"},{"type":"category","label":"Walk-throughs","items":[{"type":"link","label":"React: Build a backend","href":"/walk-throughs/react-app","docId":"walk-throughs/react-app","unlisted":false},{"type":"link","label":"Slack: send and receive messages","href":"/walk-throughs/slack-app","docId":"walk-throughs/slack-app","unlisted":false},{"type":"link","label":"Using an External DB","href":"/walk-throughs/external-db","docId":"walk-throughs/external-db","unlisted":false},{"type":"link","label":"Slack: check for new channels","href":"/walk-throughs/slack-channel-check","docId":"walk-throughs/slack-channel-check","unlisted":false},{"type":"link","label":"Asana: create tasks and projects from Slack","href":"/walk-throughs/slack-asana","docId":"walk-throughs/slack-asana","unlisted":false},{"type":"link","label":"Trello: Create a new card from Slack","href":"/walk-throughs/slack-trello","docId":"walk-throughs/slack-trello","unlisted":false},{"type":"link","label":"Twilio: send and receive texts","href":"/walk-throughs/twilio-app","docId":"walk-throughs/twilio-app","unlisted":false},{"type":"link","label":"IFTTT: trigger an event","href":"/walk-throughs/ifttt-events","docId":"walk-throughs/ifttt-events","unlisted":false},{"type":"link","label":"Airtable: fetch and update","href":"/walk-throughs/airtable","docId":"walk-throughs/airtable","unlisted":false},{"type":"link","label":"Freshdesk: Fetch and update tickets","href":"/walk-throughs/freshdesk","docId":"walk-throughs/freshdesk","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/walk-throughs"},{"type":"category","label":"How-to Guides","items":[{"type":"link","label":"How to host Static Assets","href":"/how-to/static-assets","docId":"how-to/static-assets","unlisted":false},{"type":"link","label":"How to set up a custom domain","href":"/how-to/custom-domains","docId":"how-to/custom-domains","unlisted":false},{"type":"link","label":"How to work with CORS","href":"/how-to/cors","docId":"how-to/cors","unlisted":false},{"type":"link","label":"How to collaborate with other developers","href":"/how-to/collaborate","docId":"how-to/collaborate","unlisted":false},{"type":"link","label":"How to use Feature Flags","href":"/how-to/feature-flags","docId":"how-to/feature-flags","unlisted":false},{"type":"link","label":"How to write tests","href":"/how-to/write-tests","docId":"how-to/write-tests","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/how-to"},{"type":"category","label":"Discussion","items":[{"type":"link","label":"Overview","href":"/discussion/languageoverview","docId":"discussion/languageoverview","unlisted":false},{"type":"link","label":"Unique Aspects","href":"/discussion/unique-aspects","docId":"discussion/unique-aspects","unlisted":false},{"type":"link","label":"Functional Aspects","href":"/discussion/functional-aspects","docId":"discussion/functional-aspects","unlisted":false},{"type":"link","label":"When to use Darklang","href":"/discussion/when-dark","docId":"discussion/when-dark","unlisted":false},{"type":"link","label":"Queues","href":"/discussion/queues","docId":"discussion/queues","unlisted":false},{"type":"link","label":"Components","href":"/discussion/dark-backend-components","docId":"discussion/dark-backend-components","unlisted":false},{"type":"link","label":"Trace Driven Development","href":"/discussion/trace-driven-development","docId":"discussion/trace-driven-development","unlisted":false},{"type":"link","label":"Structured Editing","href":"/discussion/structured-editing","docId":"discussion/structured-editing","unlisted":false},{"type":"link","label":"Error Handling","href":"/discussion/error-handling","docId":"discussion/error-handling","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/discussion"},{"type":"category","label":"Changelog","items":[{"type":"link","label":"Release 10 - Jan, 2023","href":"/changelog/release-10","docId":"changelog/release-10","unlisted":false},{"type":"link","label":"Release 9 - Dec, 2022","href":"/changelog/release-9","docId":"changelog/release-9","unlisted":false},{"type":"link","label":"Release 8 - Nov, 2022","href":"/changelog/release-8","docId":"changelog/release-8","unlisted":false},{"type":"link","label":"Release 7 - Oct, 2022","href":"/changelog/release-7","docId":"changelog/release-7","unlisted":false},{"type":"link","label":"Release 6 - Sept, 2022","href":"/changelog/release-6","docId":"changelog/release-6","unlisted":false},{"type":"link","label":"Release 5 - Aug, 2022","href":"/changelog/release-5","docId":"changelog/release-5","unlisted":false},{"type":"link","label":"Release 4 - July, 2022","href":"/changelog/release-4","docId":"changelog/release-4","unlisted":false},{"type":"link","label":"Release 3 - June, 2022","href":"/changelog/release-3","docId":"changelog/release-3","unlisted":false},{"type":"link","label":"Release 2 - June 6, 2022","href":"/changelog/release-2","docId":"changelog/release-2","unlisted":false},{"type":"link","label":"Release 1","href":"/changelog/release-1","docId":"changelog/release-1","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/changelog"},{"type":"category","label":"Reference","items":[{"type":"category","label":"Cheat Sheets","items":[{"type":"link","label":"Python Cheat Sheet","href":"/reference/cheatsheets/python-cheatsheet","docId":"reference/cheatsheets/python-cheatsheet","unlisted":false},{"type":"link","label":"Javascript cheat sheet","href":"/reference/cheatsheets/javascript-cheatsheet","docId":"reference/cheatsheets/javascript-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Function & Package reference","items":[{"type":"link","label":"Built-in Function reference","href":"/reference/function-reference","docId":"reference/function-reference","unlisted":false},{"type":"link","label":"Packages","href":"/reference/packages","docId":"reference/packages","unlisted":false},{"type":"link","label":"HTTP Client","href":"/reference/httpclient","docId":"reference/httpclient","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Framework components","items":[{"type":"link","label":"HTTP Framework","href":"/reference/framework/http-framework","docId":"reference/framework/http-framework","unlisted":false},{"type":"link","label":"Datastores","href":"/reference/framework/datastores","docId":"reference/framework/datastores","unlisted":false},{"type":"link","label":"Workers","href":"/reference/framework/workers","docId":"reference/framework/workers","unlisted":false},{"type":"link","label":"Cron","href":"/reference/framework/cron","docId":"reference/framework/cron","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Sample Canvases","href":"/reference/sample-canvases","docId":"reference/sample-canvases","unlisted":false},{"type":"link","label":"Language Details","href":"/reference/languagedetails","docId":"reference/languagedetails","unlisted":false},{"type":"link","label":"Keyboard Mapping","href":"/reference/keyboard-mapping","docId":"reference/keyboard-mapping","unlisted":false},{"type":"link","label":"Support & Feedback","href":"/reference/support","docId":"reference/support","unlisted":false},{"type":"link","label":"Sharing Darklang","href":"/reference/sharing-dark","docId":"reference/sharing-dark","unlisted":false},{"type":"link","label":"FAQs","href":"/reference/faqs","docId":"reference/faqs","unlisted":false},{"type":"link","label":"Terms of Service / SLA","href":"/reference/terms-of-service","docId":"reference/terms-of-service","unlisted":false},{"type":"link","label":"Backward compatibility","href":"/reference/backward-compatibility","docId":"reference/backward-compatibility","unlisted":false},{"type":"link","label":"Desktop Client","href":"/reference/desktop-client","docId":"reference/desktop-client","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/reference"}],"Contributing":[{"type":"category","label":"Your First Contribution","items":[{"type":"link","label":"Getting started","href":"/contributing/getting-started","docId":"contributing/getting-started","unlisted":false},{"type":"link","label":"Setting up the Darklang repo","href":"/contributing/setting-up-the-repo","docId":"contributing/setting-up-the-repo","unlisted":false},{"type":"link","label":"Adding your first test","href":"/contributing/adding-your-first-test","docId":"contributing/adding-your-first-test","unlisted":false},{"type":"link","label":"Making your first Pull Request","href":"/contributing/making-your-first-pull-request","docId":"contributing/making-your-first-pull-request","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Your Next Contributions","items":[{"type":"link","label":"Your next contribution","href":"/contributing/next-contribution","docId":"contributing/next-contribution","unlisted":false},{"type":"link","label":"If you don\'t know our stack (F#)","href":"/contributing/if-you-dont-know-our-stack","docId":"contributing/if-you-dont-know-our-stack","unlisted":false},{"type":"link","label":"Adding a built-in function","href":"/contributing/adding-a-function","docId":"contributing/adding-a-function","unlisted":false},{"type":"link","label":"Adding a language feature","href":"/contributing/adding-a-language-feature","docId":"contributing/adding-a-language-feature","unlisted":false},{"type":"link","label":"Adding a refactoring","href":"/contributing/adding-a-refactoring","docId":"contributing/adding-a-refactoring","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Working in the Dark repo","items":[{"type":"link","label":"F# for Darklang developers","href":"/contributing/fsharp-for-dark-developers","docId":"contributing/fsharp-for-dark-developers","unlisted":false},{"type":"link","label":"General concepts","href":"/contributing/general-concepts","docId":"contributing/general-concepts","unlisted":false},{"type":"link","label":"A tour of the Backend","href":"/contributing/tour-of-backend","docId":"contributing/tour-of-backend","unlisted":false},{"type":"link","label":"Repository directory structure","href":"/contributing/repo-layout","docId":"contributing/repo-layout","unlisted":false},{"type":"link","label":"Glossary","href":"/contributing/glossary","docId":"contributing/glossary","unlisted":false},{"type":"link","label":"Debugging","href":"/contributing/debugging","docId":"contributing/debugging","unlisted":false},{"type":"link","label":"Troubleshooting","href":"/contributing/troubleshooting","docId":"contributing/troubleshooting","unlisted":false},{"type":"link","label":"Making a Pull Request","href":"/contributing/making-a-pull-request","docId":"contributing/making-a-pull-request","unlisted":false},{"type":"link","label":"New-Release Checklist","href":"/contributing/new-release-checklist","docId":"contributing/new-release-checklist","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"While we continuously deliver features as they\'re written, we like to","sidebar":"docs"},"changelog/release-1":{"id":"changelog/release-1","title":"Darklang Release 1","description":"In June of 2022, we switched to a \\"release\\" schedule where we publish release","sidebar":"docs"},"changelog/release-10":{"id":"changelog/release-10","title":"Darklang Release 10","description":"Febuary 1, 2023","sidebar":"docs"},"changelog/release-2":{"id":"changelog/release-2","title":"Darklang Release 2","description":"June 6th, 2022","sidebar":"docs"},"changelog/release-3":{"id":"changelog/release-3","title":"Darklang Release 3","description":"July 1, 2022","sidebar":"docs"},"changelog/release-4":{"id":"changelog/release-4","title":"Darklang Release 4","description":"August 1, 2022","sidebar":"docs"},"changelog/release-5":{"id":"changelog/release-5","title":"Darklang Release 5","description":"September 1, 2022","sidebar":"docs"},"changelog/release-6":{"id":"changelog/release-6","title":"Darklang Release 6","description":"October 1, 2022","sidebar":"docs"},"changelog/release-7":{"id":"changelog/release-7","title":"Darklang Release 7","description":"November 1, 2022","sidebar":"docs"},"changelog/release-8":{"id":"changelog/release-8","title":"Darklang Release 8","description":"December 1, 2022","sidebar":"docs"},"changelog/release-9":{"id":"changelog/release-9","title":"Darklang Release 9","description":"January 1, 2023","sidebar":"docs"},"contributing/adding-a-function":{"id":"contributing/adding-a-function","title":"Adding a built-in function","description":"Adding a built-in or \\"Standard Library Function\\" is usually straight-forward","sidebar":"Contributing"},"contributing/adding-a-language-feature":{"id":"contributing/adding-a-language-feature","title":"Adding a language feature","description":"There are a number of","sidebar":"Contributing"},"contributing/adding-a-refactoring":{"id":"contributing/adding-a-refactoring","title":"Adding a refactoring","description":"Coming soon","sidebar":"Contributing"},"contributing/adding-your-first-test":{"id":"contributing/adding-your-first-test","title":"Adding your first test","description":"Let\'s talk you through the first contribution. You\'ll write a small unit test","sidebar":"Contributing"},"contributing/debugging":{"id":"contributing/debugging","title":"Debugging","description":"Log statements","sidebar":"Contributing"},"contributing/fsharp-for-dark-developers":{"id":"contributing/fsharp-for-dark-developers","title":"F# for Darklang developers","description":"This guide aims to introduce you to enough F# contribute to Darklang, assuming","sidebar":"Contributing"},"contributing/general-concepts":{"id":"contributing/general-concepts","title":"General concepts","description":"Editor vs Production (how code runs)","sidebar":"Contributing"},"contributing/getting-started":{"id":"contributing/getting-started","title":"Getting started","description":"_Note that you can also","sidebar":"Contributing"},"contributing/glossary":{"id":"contributing/glossary","title":"Glossary","description":"Coming soon","sidebar":"Contributing"},"contributing/if-you-dont-know-our-stack":{"id":"contributing/if-you-dont-know-our-stack","title":"If you don\'t know our stack (F#)","description":"F# can be a little bit daunting, but even if you don\'t know them, there are a","sidebar":"Contributing"},"contributing/making-a-pull-request":{"id":"contributing/making-a-pull-request","title":"Making a Pull Request","description":"Code Checklist","sidebar":"Contributing"},"contributing/making-your-first-pull-request":{"id":"contributing/making-your-first-pull-request","title":"Making your first Pull Request","description":"Right now you\'ve got uncommitted code, let\'s get that into a Pull Request on","sidebar":"Contributing"},"contributing/new-release-checklist":{"id":"contributing/new-release-checklist","title":"New-Release Checklist","description":"Every month, we \\"release\\" the work done in the previous month. While we","sidebar":"Contributing"},"contributing/next-contribution":{"id":"contributing/next-contribution","title":"Your next contribution","description":"We have everyone start with a first PR, which makes a","sidebar":"Contributing"},"contributing/repo-layout":{"id":"contributing/repo-layout","title":"Repository directory structure","description":"The Darklang repo contains multiple services and compilation targets","sidebar":"Contributing"},"contributing/setting-up-the-repo":{"id":"contributing/setting-up-the-repo","title":"Setting up the Darklang repo","description":"You can access the Darklang repo at","sidebar":"Contributing"},"contributing/tour-of-backend":{"id":"contributing/tour-of-backend","title":"A tour of the Backend","description":"The journey of a HTTP request","sidebar":"Contributing"},"contributing/troubleshooting":{"id":"contributing/troubleshooting","title":"Troubleshooting","description":"If you\'re having problems contributing, we want to help:","sidebar":"Contributing"},"discussion/dark-backend-components":{"id":"discussion/dark-backend-components","title":"Components","description":"When building in Darklang, you are able to create five major backend components,","sidebar":"docs"},"discussion/error-handling":{"id":"discussion/error-handling","title":"Error Handling","description":"The Darklang code you write in your handlers is available as soon as you type","sidebar":"docs"},"discussion/functional-aspects":{"id":"discussion/functional-aspects","title":"Functional Aspects","description":"Implicit Returns","sidebar":"docs"},"discussion/languageoverview":{"id":"discussion/languageoverview","title":"Language Overview","description":"Darklang isn\'t just a language. It\'s a combination of the language, editor,","sidebar":"docs"},"discussion/queues":{"id":"discussion/queues","title":"Queues","description":"Darklang\'s built-in queues allow programs to be run in the background.","sidebar":"docs"},"discussion/structured-editing":{"id":"discussion/structured-editing","title":"Structured Editing","description":"_Note: for now, Darklang is only supported for Chrome with browser extensions","sidebar":"docs"},"discussion/trace-driven-development":{"id":"discussion/trace-driven-development","title":"Trace Driven Development","description":"Darklang flows from end user experience through to the backend components. If","sidebar":"docs"},"discussion/unique-aspects":{"id":"discussion/unique-aspects","title":"Unique Aspects","description":"Darklang being connected to the editor and infrastructure allows for unique","sidebar":"docs"},"discussion/when-dark":{"id":"discussion/when-dark","title":"When should you use Darklang?","description":"Darklang is good for making backends that need to speak HTTP, store data, do","sidebar":"docs"},"how-to/collaborate":{"id":"how-to/collaborate","title":"How to collaborate with other developers","description":"Darklang supports multiple developers editing the same canvases.","sidebar":"docs"},"how-to/cors":{"id":"how-to/cors","title":"How to work with CORS in Darklang","description":"By default, browsers don\'t allow Javascript to make certain kinds of API calls","sidebar":"docs"},"how-to/custom-domains":{"id":"how-to/custom-domains","title":"How to set up a Custom Domain","description":"Your backend endpoints are always available at","sidebar":"docs"},"how-to/feature-flags":{"id":"how-to/feature-flags","title":"How to use Feature Flags","description":"In Darklang, all changes are made in production, on your real infrastructure. If","sidebar":"docs"},"how-to/static-assets":{"id":"how-to/static-assets","title":"How to host Static Assets on Darklang","description":"Darklang supports hosting your static assets.","sidebar":"docs"},"how-to/write-tests":{"id":"how-to/write-tests","title":"How to Write Tests in Darklang","description":"At the moment, Darklang does not provide an out of the box testing framework.","sidebar":"docs"},"introduction":{"id":"introduction","title":"Overview of Darklang Classic","description":"Darklang is an integrated language, framework, and editor for building web","sidebar":"docs"},"reference/backward-compatibility":{"id":"reference/backward-compatibility","title":"Backward compatibility","description":"We aim to keep Darklang\'s behavior consistent and backwards compatible, in order","sidebar":"docs"},"reference/cheatsheets/javascript-cheatsheet":{"id":"reference/cheatsheets/javascript-cheatsheet","title":"Javascript cheat sheet","description":"This guide will help you learn Darklang if you\'re familiar with Javascript.","sidebar":"docs"},"reference/cheatsheets/python-cheatsheet":{"id":"reference/cheatsheets/python-cheatsheet","title":"Python Cheat Sheet","description":"This guide will help you learn Darklang if you\'re familiar with Python.","sidebar":"docs"},"reference/desktop-client":{"id":"reference/desktop-client","title":"Desktop Client","description":"If you prefer to run Darklang as an application, we offer a desktop client","sidebar":"docs"},"reference/faqs":{"id":"reference/faqs","title":"FAQs","description":"Some common questions about Darklang. Don\'t see what you\'re looking for?","sidebar":"docs"},"reference/framework/cron":{"id":"reference/framework/cron","title":"Cron","description":"Darklang supports scheduled jobs via a Cron component. Use a Cron when you want to","sidebar":"docs"},"reference/framework/datastores":{"id":"reference/framework/datastores","title":"Datastores","description":"Overview","sidebar":"docs"},"reference/framework/http-framework":{"id":"reference/framework/http-framework","title":"HTTP Framework","description":"HTTP requests to a Darklang application are automatically routed to handlers in","sidebar":"docs"},"reference/framework/workers":{"id":"reference/framework/workers","title":"Workers","description":"Darklang supports doing work asynchronously outside the context of an HTTP handler","sidebar":"docs"},"reference/function-reference":{"id":"reference/function-reference","title":"Built-in Function reference","description":"We maintain an automatically-generated list of all (non-deprecated)","sidebar":"docs"},"reference/httpclient":{"id":"reference/httpclient","title":"HTTP Client","description":"Overview","sidebar":"docs"},"reference/keyboard-mapping":{"id":"reference/keyboard-mapping","title":"Keyboard Mapping","description":"Canvas mode","sidebar":"docs"},"reference/languagedetails":{"id":"reference/languagedetails","title":"Language Details","description":"This doc describes the Darklang language. Darklang is really a system - a","sidebar":"docs"},"reference/packages":{"id":"reference/packages","title":"Packages","description":"Overview","sidebar":"docs"},"reference/sample-canvases":{"id":"reference/sample-canvases","title":"Sample Canvases","description":"We\'ve created a set of sample canvases as examples of how build things in","sidebar":"docs"},"reference/sharing-dark":{"id":"reference/sharing-dark","title":"Sharing Darklang","description":"Thanks for being part of our beta! We\'d love for you to share your Darklang","sidebar":"docs"},"reference/support":{"id":"reference/support","title":"Support & Feedback","description":"Support","sidebar":"docs"},"reference/terms-of-service":{"id":"reference/terms-of-service","title":"Terms of Service / SLA","description":"Code of conduct / Terms of service","sidebar":"docs"},"tutorials/call-external-api":{"id":"tutorials/call-external-api","title":"Tutorial: Call an external API","description":"Darklang has built-in standard libraries for working with external HTTP Calls","sidebar":"docs"},"tutorials/complete-first-application":{"id":"tutorials/complete-first-application","title":"Tutorial: Complete your first Darklang application","description":"To try out the end-to-end application:","sidebar":"docs"},"tutorials/create-daily-job-cron-handler":{"id":"tutorials/create-daily-job-cron-handler","title":"Tutorial: Create a daily job with a Cron handler","description":"Now that we\'re storing requests, we can use a scheduled job (a \\"Cron\\", named","sidebar":"docs"},"tutorials/create-http-handler":{"id":"tutorials/create-http-handler","title":"Tutorial: Create a HTTP handler","description":"Let\'s start by using the editor to write an API endpoint that responds to a","sidebar":"docs"},"tutorials/create-tool-repl":{"id":"tutorials/create-tool-repl","title":"Tutorial: Create a tool in a REPL","description":"REPLs in Darklang are general-purpose coding blocks. They\'re typically to create","sidebar":"docs"},"tutorials/extract-function":{"id":"tutorials/extract-function","title":"Tutorial: Extract code into a function","description":"Next, we\'ll create the human readable summary of the daily reports. To ensure","sidebar":"docs"},"tutorials/first-dark-application":{"id":"tutorials/first-dark-application","title":"Tutorial: Your first Darklang application","description":"We\'re going to take you through a tutorial to build an entire application that","sidebar":"docs"},"tutorials/handle-error-errorrail":{"id":"tutorials/handle-error-errorrail","title":"Tutorial: Handle error messages with the Error Rail","description":"Note: This is a self-contained tutorial and not part of the previous set.","sidebar":"docs"},"tutorials/next-steps":{"id":"tutorials/next-steps","title":"Next steps","description":"Now that you\'ve completed the first application, you should be able to use","sidebar":"docs"},"tutorials/process-background-jobs-worker":{"id":"tutorials/process-background-jobs-worker","title":"Tutorial: Process background jobs in a Worker","description":"Workers process jobs in the background, ideal for daily reports. They\'re also","sidebar":"docs"},"tutorials/save-data-to-datastore":{"id":"tutorials/save-data-to-datastore","title":"Tutorial: Save data to a Datastore","description":"In the last section, we made a HTTP request that created a 404. We\'ll use _the","sidebar":"docs"},"walk-throughs/airtable":{"id":"walk-throughs/airtable","title":"Walk-through: Fetch and update an Airtable","description":"This guide will walk you through how you can use Airtable\u2019s API to add or update","sidebar":"docs"},"walk-throughs/external-db":{"id":"walk-throughs/external-db","title":"Using an External DB","description":"Your project may require a more complex data structure than our datastores. If a","sidebar":"docs"},"walk-throughs/freshdesk":{"id":"walk-throughs/freshdesk","title":"Walk-through: Fetch and update tickets on Freshdesk","description":"This guide will walk you through how you can use Freshdesk\u2019s API to access","sidebar":"docs"},"walk-throughs/ifttt-events":{"id":"walk-throughs/ifttt-events","title":"Walk-through: Trigger an event on IFTTT","description":"In this tutorial, we will create a tool that allows you to approve or deny users","sidebar":"docs"},"walk-throughs/react-app":{"id":"walk-throughs/react-app","title":"Walkthrough: Build a backend to a React app","description":"Watch a demo video of this project:","sidebar":"docs"},"walk-throughs/slack-app":{"id":"walk-throughs/slack-app","title":"Walk-through: Send and receive messages","description":"Watch a","sidebar":"docs"},"walk-throughs/slack-asana":{"id":"walk-throughs/slack-asana","title":"Walk-through: Create Asana tasks and projects from Slack","description":"Connecting your Asana account with your Slack account can make for a powerful","sidebar":"docs"},"walk-throughs/slack-channel-check":{"id":"walk-throughs/slack-channel-check","title":"Walk-through: Check for New Slack Channels","description":"It can be hard to keep up with all of the changes in your Slack workspace! This","sidebar":"docs"},"walk-throughs/slack-trello":{"id":"walk-throughs/slack-trello","title":"Walk-through: Create a New Trello Card from Slack","description":"Connecting your Trello account with your Slack account can make for a powerful","sidebar":"docs"},"walk-throughs/twilio-app":{"id":"walk-throughs/twilio-app","title":"Walk-through: Send and receive texts via Twilio","description":"Darklang allows you to build backends (API endpoints, workers, cron, and data","sidebar":"docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.d6bca1f1.js b/assets/js/22dd74f7.d6bca1f1.js new file mode 100644 index 000000000..4c5c95363 --- /dev/null +++ b/assets/js/22dd74f7.d6bca1f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1567],{55226:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Overview of Darklang Classic","href":"/introduction","docId":"introduction","unlisted":false},{"type":"category","label":"Tutorial","items":[{"type":"link","label":"Your first Darklang application","href":"/tutorials/first-dark-application","docId":"tutorials/first-dark-application","unlisted":false},{"type":"link","label":"Create a HTTP handler","href":"/tutorials/create-http-handler","docId":"tutorials/create-http-handler","unlisted":false},{"type":"link","label":"Create a tool in a REPL","href":"/tutorials/create-tool-repl","docId":"tutorials/create-tool-repl","unlisted":false},{"type":"link","label":"Save data to a Datastore","href":"/tutorials/save-data-to-datastore","docId":"tutorials/save-data-to-datastore","unlisted":false},{"type":"link","label":"Create a daily job with a Cron handler","href":"/tutorials/create-daily-job-cron-handler","docId":"tutorials/create-daily-job-cron-handler","unlisted":false},{"type":"link","label":"Process background jobs in a Worker","href":"/tutorials/process-background-jobs-worker","docId":"tutorials/process-background-jobs-worker","unlisted":false},{"type":"link","label":"Extract code into a Function","href":"/tutorials/extract-function","docId":"tutorials/extract-function","unlisted":false},{"type":"link","label":"Call an external API","href":"/tutorials/call-external-api","docId":"tutorials/call-external-api","unlisted":false},{"type":"link","label":"Complete your first application","href":"/tutorials/complete-first-application","docId":"tutorials/complete-first-application","unlisted":false},{"type":"link","label":"Handle error messages with the Error Rail","href":"/tutorials/handle-error-errorrail","docId":"tutorials/handle-error-errorrail","unlisted":false},{"type":"link","label":"Next steps","href":"/tutorials/next-steps","docId":"tutorials/next-steps","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/tutorial"},{"type":"category","label":"Walk-throughs","items":[{"type":"link","label":"React: Build a backend","href":"/walk-throughs/react-app","docId":"walk-throughs/react-app","unlisted":false},{"type":"link","label":"Slack: send and receive messages","href":"/walk-throughs/slack-app","docId":"walk-throughs/slack-app","unlisted":false},{"type":"link","label":"Using an External DB","href":"/walk-throughs/external-db","docId":"walk-throughs/external-db","unlisted":false},{"type":"link","label":"Slack: check for new channels","href":"/walk-throughs/slack-channel-check","docId":"walk-throughs/slack-channel-check","unlisted":false},{"type":"link","label":"Asana: create tasks and projects from Slack","href":"/walk-throughs/slack-asana","docId":"walk-throughs/slack-asana","unlisted":false},{"type":"link","label":"Trello: Create a new card from Slack","href":"/walk-throughs/slack-trello","docId":"walk-throughs/slack-trello","unlisted":false},{"type":"link","label":"Twilio: send and receive texts","href":"/walk-throughs/twilio-app","docId":"walk-throughs/twilio-app","unlisted":false},{"type":"link","label":"IFTTT: trigger an event","href":"/walk-throughs/ifttt-events","docId":"walk-throughs/ifttt-events","unlisted":false},{"type":"link","label":"Airtable: fetch and update","href":"/walk-throughs/airtable","docId":"walk-throughs/airtable","unlisted":false},{"type":"link","label":"Freshdesk: Fetch and update tickets","href":"/walk-throughs/freshdesk","docId":"walk-throughs/freshdesk","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/walk-throughs"},{"type":"category","label":"How-to Guides","items":[{"type":"link","label":"How to host Static Assets","href":"/how-to/static-assets","docId":"how-to/static-assets","unlisted":false},{"type":"link","label":"How to set up a custom domain","href":"/how-to/custom-domains","docId":"how-to/custom-domains","unlisted":false},{"type":"link","label":"How to work with CORS","href":"/how-to/cors","docId":"how-to/cors","unlisted":false},{"type":"link","label":"How to collaborate with other developers","href":"/how-to/collaborate","docId":"how-to/collaborate","unlisted":false},{"type":"link","label":"How to use Feature Flags","href":"/how-to/feature-flags","docId":"how-to/feature-flags","unlisted":false},{"type":"link","label":"How to write tests","href":"/how-to/write-tests","docId":"how-to/write-tests","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/how-to"},{"type":"category","label":"Discussion","items":[{"type":"link","label":"Overview","href":"/discussion/languageoverview","docId":"discussion/languageoverview","unlisted":false},{"type":"link","label":"Unique Aspects","href":"/discussion/unique-aspects","docId":"discussion/unique-aspects","unlisted":false},{"type":"link","label":"Functional Aspects","href":"/discussion/functional-aspects","docId":"discussion/functional-aspects","unlisted":false},{"type":"link","label":"When to use Darklang","href":"/discussion/when-dark","docId":"discussion/when-dark","unlisted":false},{"type":"link","label":"Queues","href":"/discussion/queues","docId":"discussion/queues","unlisted":false},{"type":"link","label":"Components","href":"/discussion/dark-backend-components","docId":"discussion/dark-backend-components","unlisted":false},{"type":"link","label":"Trace Driven Development","href":"/discussion/trace-driven-development","docId":"discussion/trace-driven-development","unlisted":false},{"type":"link","label":"Structured Editing","href":"/discussion/structured-editing","docId":"discussion/structured-editing","unlisted":false},{"type":"link","label":"Error Handling","href":"/discussion/error-handling","docId":"discussion/error-handling","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/discussion"},{"type":"category","label":"Changelog","items":[{"type":"link","label":"Release 10 - Jan, 2023","href":"/changelog/release-10","docId":"changelog/release-10","unlisted":false},{"type":"link","label":"Release 9 - Dec, 2022","href":"/changelog/release-9","docId":"changelog/release-9","unlisted":false},{"type":"link","label":"Release 8 - Nov, 2022","href":"/changelog/release-8","docId":"changelog/release-8","unlisted":false},{"type":"link","label":"Release 7 - Oct, 2022","href":"/changelog/release-7","docId":"changelog/release-7","unlisted":false},{"type":"link","label":"Release 6 - Sept, 2022","href":"/changelog/release-6","docId":"changelog/release-6","unlisted":false},{"type":"link","label":"Release 5 - Aug, 2022","href":"/changelog/release-5","docId":"changelog/release-5","unlisted":false},{"type":"link","label":"Release 4 - July, 2022","href":"/changelog/release-4","docId":"changelog/release-4","unlisted":false},{"type":"link","label":"Release 3 - June, 2022","href":"/changelog/release-3","docId":"changelog/release-3","unlisted":false},{"type":"link","label":"Release 2 - June 6, 2022","href":"/changelog/release-2","docId":"changelog/release-2","unlisted":false},{"type":"link","label":"Release 1","href":"/changelog/release-1","docId":"changelog/release-1","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/changelog"},{"type":"category","label":"Reference","items":[{"type":"category","label":"Cheat Sheets","items":[{"type":"link","label":"Python Cheat Sheet","href":"/reference/cheatsheets/python-cheatsheet","docId":"reference/cheatsheets/python-cheatsheet","unlisted":false},{"type":"link","label":"Javascript cheat sheet","href":"/reference/cheatsheets/javascript-cheatsheet","docId":"reference/cheatsheets/javascript-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Function & Package reference","items":[{"type":"link","label":"Built-in Function reference","href":"/reference/function-reference","docId":"reference/function-reference","unlisted":false},{"type":"link","label":"Packages","href":"/reference/packages","docId":"reference/packages","unlisted":false},{"type":"link","label":"HTTP Client","href":"/reference/httpclient","docId":"reference/httpclient","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Framework components","items":[{"type":"link","label":"HTTP Framework","href":"/reference/framework/http-framework","docId":"reference/framework/http-framework","unlisted":false},{"type":"link","label":"Datastores","href":"/reference/framework/datastores","docId":"reference/framework/datastores","unlisted":false},{"type":"link","label":"Workers","href":"/reference/framework/workers","docId":"reference/framework/workers","unlisted":false},{"type":"link","label":"Cron","href":"/reference/framework/cron","docId":"reference/framework/cron","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Sample Canvases","href":"/reference/sample-canvases","docId":"reference/sample-canvases","unlisted":false},{"type":"link","label":"Language Details","href":"/reference/languagedetails","docId":"reference/languagedetails","unlisted":false},{"type":"link","label":"Keyboard Mapping","href":"/reference/keyboard-mapping","docId":"reference/keyboard-mapping","unlisted":false},{"type":"link","label":"Support & Feedback","href":"/reference/support","docId":"reference/support","unlisted":false},{"type":"link","label":"Sharing Darklang","href":"/reference/sharing-dark","docId":"reference/sharing-dark","unlisted":false},{"type":"link","label":"FAQs","href":"/reference/faqs","docId":"reference/faqs","unlisted":false},{"type":"link","label":"Terms of Service / SLA","href":"/reference/terms-of-service","docId":"reference/terms-of-service","unlisted":false},{"type":"link","label":"Backward compatibility","href":"/reference/backward-compatibility","docId":"reference/backward-compatibility","unlisted":false},{"type":"link","label":"Desktop Client","href":"/reference/desktop-client","docId":"reference/desktop-client","unlisted":false}],"collapsed":true,"collapsible":true,"href":"/category/reference"}],"Contributing":[{"type":"category","label":"Your First Contribution","items":[{"type":"link","label":"Getting started","href":"/contributing/getting-started","docId":"contributing/getting-started","unlisted":false},{"type":"link","label":"Setting up the Darklang repo","href":"/contributing/setting-up-the-repo","docId":"contributing/setting-up-the-repo","unlisted":false},{"type":"link","label":"Adding your first test","href":"/contributing/adding-your-first-test","docId":"contributing/adding-your-first-test","unlisted":false},{"type":"link","label":"Making your first Pull Request","href":"/contributing/making-your-first-pull-request","docId":"contributing/making-your-first-pull-request","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Your Next Contributions","items":[{"type":"link","label":"Your next contribution","href":"/contributing/next-contribution","docId":"contributing/next-contribution","unlisted":false},{"type":"link","label":"If you don\'t know our stack (F#)","href":"/contributing/if-you-dont-know-our-stack","docId":"contributing/if-you-dont-know-our-stack","unlisted":false},{"type":"link","label":"Adding a built-in function","href":"/contributing/adding-a-function","docId":"contributing/adding-a-function","unlisted":false},{"type":"link","label":"Adding a language feature","href":"/contributing/adding-a-language-feature","docId":"contributing/adding-a-language-feature","unlisted":false},{"type":"link","label":"Adding a refactoring","href":"/contributing/adding-a-refactoring","docId":"contributing/adding-a-refactoring","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Working in the Dark repo","items":[{"type":"link","label":"F# for Darklang developers","href":"/contributing/fsharp-for-dark-developers","docId":"contributing/fsharp-for-dark-developers","unlisted":false},{"type":"link","label":"General concepts","href":"/contributing/general-concepts","docId":"contributing/general-concepts","unlisted":false},{"type":"link","label":"A tour of the Backend","href":"/contributing/tour-of-backend","docId":"contributing/tour-of-backend","unlisted":false},{"type":"link","label":"Repository directory structure","href":"/contributing/repo-layout","docId":"contributing/repo-layout","unlisted":false},{"type":"link","label":"Glossary","href":"/contributing/glossary","docId":"contributing/glossary","unlisted":false},{"type":"link","label":"Debugging","href":"/contributing/debugging","docId":"contributing/debugging","unlisted":false},{"type":"link","label":"Troubleshooting","href":"/contributing/troubleshooting","docId":"contributing/troubleshooting","unlisted":false},{"type":"link","label":"Making a Pull Request","href":"/contributing/making-a-pull-request","docId":"contributing/making-a-pull-request","unlisted":false},{"type":"link","label":"New-Release Checklist","href":"/contributing/new-release-checklist","docId":"contributing/new-release-checklist","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"While we continuously deliver features as they\'re written, we like to","sidebar":"docs"},"changelog/release-1":{"id":"changelog/release-1","title":"Darklang Release 1","description":"In June of 2022, we switched to a \\"release\\" schedule where we publish release","sidebar":"docs"},"changelog/release-10":{"id":"changelog/release-10","title":"Darklang Release 10","description":"Febuary 1, 2023","sidebar":"docs"},"changelog/release-2":{"id":"changelog/release-2","title":"Darklang Release 2","description":"June 6th, 2022","sidebar":"docs"},"changelog/release-3":{"id":"changelog/release-3","title":"Darklang Release 3","description":"July 1, 2022","sidebar":"docs"},"changelog/release-4":{"id":"changelog/release-4","title":"Darklang Release 4","description":"August 1, 2022","sidebar":"docs"},"changelog/release-5":{"id":"changelog/release-5","title":"Darklang Release 5","description":"September 1, 2022","sidebar":"docs"},"changelog/release-6":{"id":"changelog/release-6","title":"Darklang Release 6","description":"October 1, 2022","sidebar":"docs"},"changelog/release-7":{"id":"changelog/release-7","title":"Darklang Release 7","description":"November 1, 2022","sidebar":"docs"},"changelog/release-8":{"id":"changelog/release-8","title":"Darklang Release 8","description":"December 1, 2022","sidebar":"docs"},"changelog/release-9":{"id":"changelog/release-9","title":"Darklang Release 9","description":"January 1, 2023","sidebar":"docs"},"contributing/adding-a-function":{"id":"contributing/adding-a-function","title":"Adding a built-in function","description":"Adding a built-in or \\"Standard Library Function\\" is usually straight-forward","sidebar":"Contributing"},"contributing/adding-a-language-feature":{"id":"contributing/adding-a-language-feature","title":"Adding a language feature","description":"There are a number of","sidebar":"Contributing"},"contributing/adding-a-refactoring":{"id":"contributing/adding-a-refactoring","title":"Adding a refactoring","description":"Coming soon","sidebar":"Contributing"},"contributing/adding-your-first-test":{"id":"contributing/adding-your-first-test","title":"Adding your first test","description":"Let\'s talk you through the first contribution. You\'ll write a small unit test","sidebar":"Contributing"},"contributing/debugging":{"id":"contributing/debugging","title":"Debugging","description":"Log statements","sidebar":"Contributing"},"contributing/fsharp-for-dark-developers":{"id":"contributing/fsharp-for-dark-developers","title":"F# for Darklang developers","description":"This guide aims to introduce you to enough F# contribute to Darklang, assuming","sidebar":"Contributing"},"contributing/general-concepts":{"id":"contributing/general-concepts","title":"General concepts","description":"Editor vs Production (how code runs)","sidebar":"Contributing"},"contributing/getting-started":{"id":"contributing/getting-started","title":"Getting started","description":"_Note that you can also","sidebar":"Contributing"},"contributing/glossary":{"id":"contributing/glossary","title":"Glossary","description":"Coming soon","sidebar":"Contributing"},"contributing/if-you-dont-know-our-stack":{"id":"contributing/if-you-dont-know-our-stack","title":"If you don\'t know our stack (F#)","description":"F# can be a little bit daunting, but even if you don\'t know them, there are a","sidebar":"Contributing"},"contributing/making-a-pull-request":{"id":"contributing/making-a-pull-request","title":"Making a Pull Request","description":"Code Checklist","sidebar":"Contributing"},"contributing/making-your-first-pull-request":{"id":"contributing/making-your-first-pull-request","title":"Making your first Pull Request","description":"Right now you\'ve got uncommitted code, let\'s get that into a Pull Request on","sidebar":"Contributing"},"contributing/new-release-checklist":{"id":"contributing/new-release-checklist","title":"New-Release Checklist","description":"Every month, we \\"release\\" the work done in the previous month. While we","sidebar":"Contributing"},"contributing/next-contribution":{"id":"contributing/next-contribution","title":"Your next contribution","description":"We have everyone start with a first PR, which makes a","sidebar":"Contributing"},"contributing/repo-layout":{"id":"contributing/repo-layout","title":"Repository directory structure","description":"The Darklang repo contains multiple services and compilation targets","sidebar":"Contributing"},"contributing/setting-up-the-repo":{"id":"contributing/setting-up-the-repo","title":"Setting up the Darklang repo","description":"You can access the Darklang repo at","sidebar":"Contributing"},"contributing/tour-of-backend":{"id":"contributing/tour-of-backend","title":"A tour of the Backend","description":"The journey of a HTTP request","sidebar":"Contributing"},"contributing/troubleshooting":{"id":"contributing/troubleshooting","title":"Troubleshooting","description":"If you\'re having problems contributing, we want to help:","sidebar":"Contributing"},"discussion/dark-backend-components":{"id":"discussion/dark-backend-components","title":"Components","description":"When building in Darklang, you are able to create five major backend components,","sidebar":"docs"},"discussion/error-handling":{"id":"discussion/error-handling","title":"Error Handling","description":"The Darklang code you write in your handlers is available as soon as you type","sidebar":"docs"},"discussion/functional-aspects":{"id":"discussion/functional-aspects","title":"Functional Aspects","description":"Implicit Returns","sidebar":"docs"},"discussion/languageoverview":{"id":"discussion/languageoverview","title":"Language Overview","description":"Darklang isn\'t just a language. It\'s a combination of the language, editor,","sidebar":"docs"},"discussion/queues":{"id":"discussion/queues","title":"Queues","description":"Darklang\'s built-in queues allow programs to be run in the background.","sidebar":"docs"},"discussion/structured-editing":{"id":"discussion/structured-editing","title":"Structured Editing","description":"_Note: for now, Darklang is only supported for Chrome with browser extensions","sidebar":"docs"},"discussion/trace-driven-development":{"id":"discussion/trace-driven-development","title":"Trace Driven Development","description":"Darklang flows from end user experience through to the backend components. If","sidebar":"docs"},"discussion/unique-aspects":{"id":"discussion/unique-aspects","title":"Unique Aspects","description":"Darklang being connected to the editor and infrastructure allows for unique","sidebar":"docs"},"discussion/when-dark":{"id":"discussion/when-dark","title":"When should you use Darklang?","description":"Darklang is good for making backends that need to speak HTTP, store data, do","sidebar":"docs"},"how-to/collaborate":{"id":"how-to/collaborate","title":"How to collaborate with other developers","description":"Darklang supports multiple developers editing the same canvases.","sidebar":"docs"},"how-to/cors":{"id":"how-to/cors","title":"How to work with CORS in Darklang","description":"By default, browsers don\'t allow Javascript to make certain kinds of API calls","sidebar":"docs"},"how-to/custom-domains":{"id":"how-to/custom-domains","title":"How to set up a Custom Domain","description":"Your backend endpoints are always available at","sidebar":"docs"},"how-to/feature-flags":{"id":"how-to/feature-flags","title":"How to use Feature Flags","description":"In Darklang, all changes are made in production, on your real infrastructure. If","sidebar":"docs"},"how-to/static-assets":{"id":"how-to/static-assets","title":"How to host Static Assets on Darklang","description":"Darklang supports hosting your static assets.","sidebar":"docs"},"how-to/write-tests":{"id":"how-to/write-tests","title":"How to Write Tests in Darklang","description":"At the moment, Darklang does not provide an out of the box testing framework.","sidebar":"docs"},"introduction":{"id":"introduction","title":"Overview of Darklang Classic","description":"Darklang is an integrated language, framework, and editor for building web","sidebar":"docs"},"reference/backward-compatibility":{"id":"reference/backward-compatibility","title":"Backward compatibility","description":"We aim to keep Darklang\'s behavior consistent and backwards compatible, in order","sidebar":"docs"},"reference/cheatsheets/javascript-cheatsheet":{"id":"reference/cheatsheets/javascript-cheatsheet","title":"Javascript cheat sheet","description":"This guide will help you learn Darklang if you\'re familiar with Javascript.","sidebar":"docs"},"reference/cheatsheets/python-cheatsheet":{"id":"reference/cheatsheets/python-cheatsheet","title":"Python Cheat Sheet","description":"This guide will help you learn Darklang if you\'re familiar with Python.","sidebar":"docs"},"reference/desktop-client":{"id":"reference/desktop-client","title":"Desktop Client","description":"If you prefer to run Darklang as an application, we offer a desktop client","sidebar":"docs"},"reference/faqs":{"id":"reference/faqs","title":"FAQs","description":"Some common questions about Darklang. Don\'t see what you\'re looking for?","sidebar":"docs"},"reference/framework/cron":{"id":"reference/framework/cron","title":"Cron","description":"Darklang supports scheduled jobs via a Cron component. Use a Cron when you want to","sidebar":"docs"},"reference/framework/datastores":{"id":"reference/framework/datastores","title":"Datastores","description":"Overview","sidebar":"docs"},"reference/framework/http-framework":{"id":"reference/framework/http-framework","title":"HTTP Framework","description":"HTTP requests to a Darklang application are automatically routed to handlers in","sidebar":"docs"},"reference/framework/workers":{"id":"reference/framework/workers","title":"Workers","description":"Darklang supports doing work asynchronously outside the context of an HTTP handler","sidebar":"docs"},"reference/function-reference":{"id":"reference/function-reference","title":"Built-in Function reference","description":"We maintain an automatically-generated list of all (non-deprecated)","sidebar":"docs"},"reference/httpclient":{"id":"reference/httpclient","title":"HTTP Client","description":"Overview","sidebar":"docs"},"reference/keyboard-mapping":{"id":"reference/keyboard-mapping","title":"Keyboard Mapping","description":"Canvas mode","sidebar":"docs"},"reference/languagedetails":{"id":"reference/languagedetails","title":"Language Details","description":"This doc describes the Darklang language. Darklang is really a system - a","sidebar":"docs"},"reference/packages":{"id":"reference/packages","title":"Packages","description":"Overview","sidebar":"docs"},"reference/sample-canvases":{"id":"reference/sample-canvases","title":"Sample Canvases","description":"We\'ve created a set of sample canvases as examples of how build things in","sidebar":"docs"},"reference/sharing-dark":{"id":"reference/sharing-dark","title":"Sharing Darklang","description":"Thanks for being part of our beta! We\'d love for you to share your Darklang","sidebar":"docs"},"reference/support":{"id":"reference/support","title":"Support & Feedback","description":"Support","sidebar":"docs"},"reference/terms-of-service":{"id":"reference/terms-of-service","title":"Terms of Service / SLA","description":"Code of conduct / Terms of service","sidebar":"docs"},"tutorials/call-external-api":{"id":"tutorials/call-external-api","title":"Tutorial: Call an external API","description":"Darklang has built-in standard libraries for working with external HTTP Calls","sidebar":"docs"},"tutorials/complete-first-application":{"id":"tutorials/complete-first-application","title":"Tutorial: Complete your first Darklang application","description":"To try out the end-to-end application:","sidebar":"docs"},"tutorials/create-daily-job-cron-handler":{"id":"tutorials/create-daily-job-cron-handler","title":"Tutorial: Create a daily job with a Cron handler","description":"Now that we\'re storing requests, we can use a scheduled job (a \\"Cron\\", named","sidebar":"docs"},"tutorials/create-http-handler":{"id":"tutorials/create-http-handler","title":"Tutorial: Create a HTTP handler","description":"Let\'s start by using the editor to write an API endpoint that responds to a","sidebar":"docs"},"tutorials/create-tool-repl":{"id":"tutorials/create-tool-repl","title":"Tutorial: Create a tool in a REPL","description":"REPLs in Darklang are general-purpose coding blocks. They\'re typically to create","sidebar":"docs"},"tutorials/extract-function":{"id":"tutorials/extract-function","title":"Tutorial: Extract code into a function","description":"Next, we\'ll create the human readable summary of the daily reports. To ensure","sidebar":"docs"},"tutorials/first-dark-application":{"id":"tutorials/first-dark-application","title":"Tutorial: Your first Darklang application","description":"We\'re going to take you through a tutorial to build an entire application that","sidebar":"docs"},"tutorials/handle-error-errorrail":{"id":"tutorials/handle-error-errorrail","title":"Tutorial: Handle error messages with the Error Rail","description":"Note: This is a self-contained tutorial and not part of the previous set.","sidebar":"docs"},"tutorials/next-steps":{"id":"tutorials/next-steps","title":"Next steps","description":"Now that you\'ve completed the first application, you should be able to use","sidebar":"docs"},"tutorials/process-background-jobs-worker":{"id":"tutorials/process-background-jobs-worker","title":"Tutorial: Process background jobs in a Worker","description":"Workers process jobs in the background, ideal for daily reports. They\'re also","sidebar":"docs"},"tutorials/save-data-to-datastore":{"id":"tutorials/save-data-to-datastore","title":"Tutorial: Save data to a Datastore","description":"In the last section, we made a HTTP request that created a 404. We\'ll use _the","sidebar":"docs"},"walk-throughs/airtable":{"id":"walk-throughs/airtable","title":"Walk-through: Fetch and update an Airtable","description":"This guide will walk you through how you can use Airtable\u2019s API to add or update","sidebar":"docs"},"walk-throughs/external-db":{"id":"walk-throughs/external-db","title":"Using an External DB","description":"Your project may require a more complex data structure than our datastores. If a","sidebar":"docs"},"walk-throughs/freshdesk":{"id":"walk-throughs/freshdesk","title":"Walk-through: Fetch and update tickets on Freshdesk","description":"This guide will walk you through how you can use Freshdesk\u2019s API to access","sidebar":"docs"},"walk-throughs/ifttt-events":{"id":"walk-throughs/ifttt-events","title":"Walk-through: Trigger an event on IFTTT","description":"In this tutorial, we will create a tool that allows you to approve or deny users","sidebar":"docs"},"walk-throughs/react-app":{"id":"walk-throughs/react-app","title":"Walkthrough: Build a backend to a React app","description":"Watch a demo video of this project:","sidebar":"docs"},"walk-throughs/slack-app":{"id":"walk-throughs/slack-app","title":"Walk-through: Send and receive messages","description":"Watch a","sidebar":"docs"},"walk-throughs/slack-asana":{"id":"walk-throughs/slack-asana","title":"Walk-through: Create Asana tasks and projects from Slack","description":"Connecting your Asana account with your Slack account can make for a powerful","sidebar":"docs"},"walk-throughs/slack-channel-check":{"id":"walk-throughs/slack-channel-check","title":"Walk-through: Check for New Slack Channels","description":"It can be hard to keep up with all of the changes in your Slack workspace! This","sidebar":"docs"},"walk-throughs/slack-trello":{"id":"walk-throughs/slack-trello","title":"Walk-through: Create a New Trello Card from Slack","description":"Connecting your Trello account with your Slack account can make for a powerful","sidebar":"docs"},"walk-throughs/twilio-app":{"id":"walk-throughs/twilio-app","title":"Walk-through: Send and receive texts via Twilio","description":"Darklang allows you to build backends (API endpoints, workers, cron, and data","sidebar":"docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/22e6bdb1.a0cd2be8.js b/assets/js/22e6bdb1.a0cd2be8.js deleted file mode 100644 index ee4c7e29a..000000000 --- a/assets/js/22e6bdb1.a0cd2be8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4989],{77197:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var s=n(85893),a=n(11151);const r={title:"Walk-through: Trigger an event on IFTTT",sidebar_label:"IFTTT: trigger an event"},i=void 0,o={id:"walk-throughs/ifttt-events",title:"Walk-through: Trigger an event on IFTTT",description:"In this tutorial, we will create a tool that allows you to approve or deny users",source:"@site/docs-classic/walk-throughs/ifttt-events.md",sourceDirName:"walk-throughs",slug:"/walk-throughs/ifttt-events",permalink:"/walk-throughs/ifttt-events",draft:!1,unlisted:!1,editUrl:"https://github.com/darklang/docs/edit/main/docs-classic/walk-throughs/ifttt-events.md",tags:[],version:"current",frontMatter:{title:"Walk-through: Trigger an event on IFTTT",sidebar_label:"IFTTT: trigger an event"},sidebar:"docs",previous:{title:"Twilio: send and receive texts",permalink:"/walk-throughs/twilio-app"},next:{title:"Airtable: fetch and update",permalink:"/walk-throughs/airtable"}},c={},l=[{value:"Waitlist Functionality",id:"waitlist-functionality",level:2},{value:"Creating Alerts",id:"creating-alerts",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.a)(),...e.components},{Details:r}=t;return r||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"In this tutorial, we will create a tool that allows you to approve or deny users\nwho have joined a waitlist, and receive alerts about the waitlist via IFTTT. For\nthe purposes of this tutorial, we will host everything locally instead of\nuploading via static assets."}),"\n",(0,s.jsx)(t.h2,{id:"waitlist-functionality",children:"Waitlist Functionality"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Start by making a simple web form to allow users to join your waitlist. All\nof the work for this tutorial can be done locally, but if you're interested\nyou can learn more about\n",(0,s.jsx)(t.a,{href:"/how-to/static-assets",children:"uploading static assets here."})]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.19.01_AM.png",src:n(78903).Z+"",width:"478",height:"378"})}),"\n",(0,s.jsx)(t.p,{children:"We've used the code below - note that you will need to replace the URL that is\nposted to with your own username and canvas."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-HTML",children:'\n
\n
\n
\n
\n
\n
\n
\n \n
\n\n'})}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsx)(t.li,{children:'Enter some information on the form and click "submit". You will get a 404\nerror.'}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.19.18_AM.png",src:n(25234).Z+"",width:"522",height:"52"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Go to your canvas and check your 404s in the sidebar - a new one should be\navailable. Click to add it to your canvas."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.19.31_AM.png",src:n(26367).Z+"",width:"636",height:"128"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsx)(t.li,{children:"Once your handler has been added, you can mouse over the trace (white dot on\nthe left) to see the data you passed through via the form."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.19.50_AM.png",src:n(70785).Z+"",width:"1430",height:"236"})}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsx)(t.li,{children:"We're going to want to add this information to a datastore - create a new one\nvia the sidebar and add the following fields."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.20.55_AM.png",src:n(74260).Z+"",width:"778",height:"424"})}),"\n",(0,s.jsxs)(t.ol,{start:"6",children:["\n",(0,s.jsx)(t.li,{children:"Grab the email, name and number of twitter followers from the request."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.21.33_AM.png",src:n(75825).Z+"",width:"740",height:"216"})}),"\n",(0,s.jsxs)(t.ol,{start:"7",children:["\n",(0,s.jsxs)(t.li,{children:["Use a ",(0,s.jsx)(t.code,{children:"DB::set"})," to add the information to your datastore. Note that we've\nalso set the ",(0,s.jsx)(t.code,{children:"reviewed"})," and ",(0,s.jsx)(t.code,{children:"reviewResult"})," fields. We will be using these to\nkeep track of where waitlist entries are in the process."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.22.37_AM.png",src:n(87698).Z+"",width:"746",height:"504"})}),"\n",(0,s.jsxs)(t.ol,{start:"8",children:["\n",(0,s.jsx)(t.li,{children:"Resubmit your form, or use the play button to run your handler. Your\ndatastore should update and lock."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"iftttalerts/Screen_Shot_2020-05-19_at_9.22.52_AM.png",src:n(47265).Z+"",width:"762",height:"360"})}),"\n",(0,s.jsxs)(t.ol,{start:"9",children:["\n",(0,s.jsxs)(t.li,{children:["We now need to create a few more files to see our waitlist queue. Note that\nyou will need to replace the URLs in ",(0,s.jsx)(t.code,{children:"script.js"})," with your username and\ncanvas name."]}),"\n"]}),"\n",(0,s.jsxs)(r,{children:[(0,s.jsx)("summary",{children:"queue.html"}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-html",children:'\n \n \n \n\n Unreviewed\n\n \n \n \n\n \n
\n - - - + + + diff --git a/category/how-to.html b/category/how-to.html index 106b994f6..d47e0641c 100644 --- a/category/how-to.html +++ b/category/how-to.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/category/reference.html b/category/reference.html index 8a8f00a8e..7557f953a 100644 --- a/category/reference.html +++ b/category/reference.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/category/tutorial.html b/category/tutorial.html index aaa0c008c..21f5da31d 100644 --- a/category/tutorial.html +++ b/category/tutorial.html @@ -8,9 +8,9 @@ - - - + + +
diff --git a/category/walk-throughs.html b/category/walk-throughs.html index 05b5c38a4..cb1404b2b 100644 --- a/category/walk-throughs.html +++ b/category/walk-throughs.html @@ -8,9 +8,9 @@ - - - + + +
diff --git a/changelog.html b/changelog.html index 90937aaeb..5ee5e7aa6 100644 --- a/changelog.html +++ b/changelog.html @@ -8,9 +8,9 @@ - - - + + +

Changelog

While we continuously deliver features as they're written, we like to diff --git a/changelog/release-1.html b/changelog/release-1.html index ed44b907b..440635699 100644 --- a/changelog/release-1.html +++ b/changelog/release-1.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 1

diff --git a/changelog/release-10.html b/changelog/release-10.html index e45c8d906..bd7c15469 100644 --- a/changelog/release-10.html +++ b/changelog/release-10.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 10

diff --git a/changelog/release-2.html b/changelog/release-2.html index 84cc02212..f65a2d114 100644 --- a/changelog/release-2.html +++ b/changelog/release-2.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 2

diff --git a/changelog/release-3.html b/changelog/release-3.html index 9ccce2342..3081457e2 100644 --- a/changelog/release-3.html +++ b/changelog/release-3.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 3

diff --git a/changelog/release-4.html b/changelog/release-4.html index cf5634317..0b81682af 100644 --- a/changelog/release-4.html +++ b/changelog/release-4.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 4

diff --git a/changelog/release-5.html b/changelog/release-5.html index daedde8e8..9fba854f0 100644 --- a/changelog/release-5.html +++ b/changelog/release-5.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 5

diff --git a/changelog/release-6.html b/changelog/release-6.html index 992805e8c..5735d9533 100644 --- a/changelog/release-6.html +++ b/changelog/release-6.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 6

diff --git a/changelog/release-7.html b/changelog/release-7.html index d8af81b40..dbbf469dd 100644 --- a/changelog/release-7.html +++ b/changelog/release-7.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 7

diff --git a/changelog/release-8.html b/changelog/release-8.html index 887ed5c58..52adc419b 100644 --- a/changelog/release-8.html +++ b/changelog/release-8.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 8

diff --git a/changelog/release-9.html b/changelog/release-9.html index 5df90468e..0c30ecd38 100644 --- a/changelog/release-9.html +++ b/changelog/release-9.html @@ -8,9 +8,9 @@ - - - + + +

Darklang Release 9

diff --git a/contributing/adding-a-function.html b/contributing/adding-a-function.html index 795d94091..8dda1ff35 100644 --- a/contributing/adding-a-function.html +++ b/contributing/adding-a-function.html @@ -8,9 +8,9 @@ - - - + + +

Adding a built-in function

Adding a built-in or "Standard Library Function" is usually straight-forward diff --git a/contributing/adding-a-language-feature.html b/contributing/adding-a-language-feature.html index b6d06c04d..9f112cc55 100644 --- a/contributing/adding-a-language-feature.html +++ b/contributing/adding-a-language-feature.html @@ -8,9 +8,9 @@ - - - + + +

Adding a language feature

There are a number of diff --git a/contributing/adding-a-refactoring.html b/contributing/adding-a-refactoring.html index 546d29f8d..9513144cd 100644 --- a/contributing/adding-a-refactoring.html +++ b/contributing/adding-a-refactoring.html @@ -8,9 +8,9 @@ - - - + + +

diff --git a/contributing/adding-your-first-test.html b/contributing/adding-your-first-test.html index 56c7f76c9..eb3fec469 100644 --- a/contributing/adding-your-first-test.html +++ b/contributing/adding-your-first-test.html @@ -8,9 +8,9 @@ - - - + + +

Adding your first test

Let's talk you through the first contribution. You'll write a small unit test diff --git a/contributing/debugging.html b/contributing/debugging.html index 9fcf6faa2..215dbd60d 100644 --- a/contributing/debugging.html +++ b/contributing/debugging.html @@ -8,9 +8,9 @@ - - - + + +

Debugging

Log statements

diff --git a/contributing/fsharp-for-dark-developers.html b/contributing/fsharp-for-dark-developers.html index 2e04ff681..d02663842 100644 --- a/contributing/fsharp-for-dark-developers.html +++ b/contributing/fsharp-for-dark-developers.html @@ -8,9 +8,9 @@ - - - + + +

F# for Darklang developers

This guide aims to introduce you to enough F# contribute to Darklang, assuming diff --git a/contributing/general-concepts.html b/contributing/general-concepts.html index cb4e4bcd2..41e9c6ff1 100644 --- a/contributing/general-concepts.html +++ b/contributing/general-concepts.html @@ -8,9 +8,9 @@ - - - + + +

General concepts

Editor vs Production (how code runs)

diff --git a/contributing/getting-started.html b/contributing/getting-started.html index 0b960b391..7bfe262ba 100644 --- a/contributing/getting-started.html +++ b/contributing/getting-started.html @@ -8,9 +8,9 @@ - - - + + +

Getting started

Note that you can also diff --git a/contributing/glossary.html b/contributing/glossary.html index 3f2d59c80..c656bd1f1 100644 --- a/contributing/glossary.html +++ b/contributing/glossary.html @@ -8,9 +8,9 @@ - - - + + +

Glossary

Coming soon

diff --git a/contributing/if-you-dont-know-our-stack.html b/contributing/if-you-dont-know-our-stack.html index 44def1f83..a722d1f2e 100644 --- a/contributing/if-you-dont-know-our-stack.html +++ b/contributing/if-you-dont-know-our-stack.html @@ -8,9 +8,9 @@ - - - + + +

If you don't know our stack (F#)

F# can be a little bit daunting, but even if you don't know them, there are a diff --git a/contributing/making-a-pull-request.html b/contributing/making-a-pull-request.html index 8a8eebfd0..652cf9075 100644 --- a/contributing/making-a-pull-request.html +++ b/contributing/making-a-pull-request.html @@ -8,9 +8,9 @@ - - - + + +

Making a Pull Request

Code Checklist

diff --git a/contributing/making-your-first-pull-request.html b/contributing/making-your-first-pull-request.html index f2d8aa2b7..15f92c79f 100644 --- a/contributing/making-your-first-pull-request.html +++ b/contributing/making-your-first-pull-request.html @@ -8,9 +8,9 @@ - - - + + +

Making your first Pull Request

Right now you've got uncommitted code, let's get that into a Pull Request on diff --git a/contributing/new-release-checklist.html b/contributing/new-release-checklist.html index 3f6317e61..781021456 100644 --- a/contributing/new-release-checklist.html +++ b/contributing/new-release-checklist.html @@ -8,9 +8,9 @@ - - - + + +

New-Release Checklist

diff --git a/contributing/next-contribution.html b/contributing/next-contribution.html index 1a10ee9cf..11078b838 100644 --- a/contributing/next-contribution.html +++ b/contributing/next-contribution.html @@ -8,9 +8,9 @@ - - - + + +

Your next contribution

We have everyone start with a first PR, which makes a diff --git a/contributing/repo-layout.html b/contributing/repo-layout.html index 0ca8fe0e5..ac846f29c 100644 --- a/contributing/repo-layout.html +++ b/contributing/repo-layout.html @@ -8,9 +8,9 @@ - - - + + +

Repository directory structure

The Darklang repo contains multiple services and compilation targets

diff --git a/contributing/setting-up-the-repo.html b/contributing/setting-up-the-repo.html index 725c84207..3e9e91db9 100644 --- a/contributing/setting-up-the-repo.html +++ b/contributing/setting-up-the-repo.html @@ -8,9 +8,9 @@ - - - + + +

Setting up the Darklang repo

You can access the Darklang repo at diff --git a/contributing/tour-of-backend.html b/contributing/tour-of-backend.html index 02cadfe92..029c035b7 100644 --- a/contributing/tour-of-backend.html +++ b/contributing/tour-of-backend.html @@ -8,9 +8,9 @@ - - - + + +

A tour of the Backend

The journey of a HTTP request

diff --git a/contributing/troubleshooting.html b/contributing/troubleshooting.html index 835f0ec7f..80cdfd353 100644 --- a/contributing/troubleshooting.html +++ b/contributing/troubleshooting.html @@ -8,9 +8,9 @@ - - - + + +

Troubleshooting

If you're having problems contributing, we want to help:

diff --git a/discussion/dark-backend-components.html b/discussion/dark-backend-components.html index b0dfe0e79..ed1131938 100644 --- a/discussion/dark-backend-components.html +++ b/discussion/dark-backend-components.html @@ -8,9 +8,9 @@ - - - + + +

Components

When building in Darklang, you are able to create five major backend components, diff --git a/discussion/error-handling.html b/discussion/error-handling.html index 1d11be300..71bc61a76 100644 --- a/discussion/error-handling.html +++ b/discussion/error-handling.html @@ -8,9 +8,9 @@ - - - + + +

Error Handling

The Darklang code you write in your handlers is available as soon as you type diff --git a/discussion/functional-aspects.html b/discussion/functional-aspects.html index eab8a23df..c5b4f6c3a 100644 --- a/discussion/functional-aspects.html +++ b/discussion/functional-aspects.html @@ -8,9 +8,9 @@ - - - + + +

Functional Aspects

Implicit Returns

diff --git a/discussion/languageoverview.html b/discussion/languageoverview.html index 000606a55..8ad36ffe4 100644 --- a/discussion/languageoverview.html +++ b/discussion/languageoverview.html @@ -8,9 +8,9 @@ - - - + + +

Language Overview

Darklang isn't just a language. It's a combination of the language, editor, diff --git a/discussion/queues.html b/discussion/queues.html index 2a0a17cd7..9613323fe 100644 --- a/discussion/queues.html +++ b/discussion/queues.html @@ -8,9 +8,9 @@ - - - + + +

Queues

Darklang's built-in queues allow programs to be run in the background. diff --git a/discussion/structured-editing.html b/discussion/structured-editing.html index 4f16ed17a..bfa95c026 100644 --- a/discussion/structured-editing.html +++ b/discussion/structured-editing.html @@ -8,9 +8,9 @@ - - - + + +

Structured Editing

Note: for now, Darklang is only supported for Chrome with browser extensions diff --git a/discussion/trace-driven-development.html b/discussion/trace-driven-development.html index 1f2d6565c..1eb1b10b4 100644 --- a/discussion/trace-driven-development.html +++ b/discussion/trace-driven-development.html @@ -8,9 +8,9 @@ - - - + + +

Trace Driven Development

Darklang flows from end user experience through to the backend components. If diff --git a/discussion/unique-aspects.html b/discussion/unique-aspects.html index 76ae330e3..ca8bafa4d 100644 --- a/discussion/unique-aspects.html +++ b/discussion/unique-aspects.html @@ -8,9 +8,9 @@ - - - + + +

Unique Aspects

Darklang being connected to the editor and infrastructure allows for unique diff --git a/discussion/when-dark.html b/discussion/when-dark.html index 30faf5239..c25f92940 100644 --- a/discussion/when-dark.html +++ b/discussion/when-dark.html @@ -8,9 +8,9 @@ - - - + + +

When should you use Darklang?

Darklang is good for making backends that need to speak HTTP, store data, do diff --git a/how-to/collaborate.html b/how-to/collaborate.html index fa26d95d9..4f4f356ca 100644 --- a/how-to/collaborate.html +++ b/how-to/collaborate.html @@ -8,9 +8,9 @@ - - - + + +

How to collaborate with other developers

Darklang supports multiple developers editing the same canvases.

diff --git a/how-to/cors.html b/how-to/cors.html index cafba8287..86cfe9e77 100644 --- a/how-to/cors.html +++ b/how-to/cors.html @@ -8,9 +8,9 @@ - - - + + +

How to work with CORS in Darklang

By default, browsers don't allow Javascript to make certain kinds of API calls diff --git a/how-to/custom-domains.html b/how-to/custom-domains.html index 72de4fa61..256f1e981 100644 --- a/how-to/custom-domains.html +++ b/how-to/custom-domains.html @@ -8,9 +8,9 @@ - - - + + +

How to set up a Custom Domain

Your backend endpoints are always available at diff --git a/how-to/feature-flags.html b/how-to/feature-flags.html index 2347f811e..0c09214b5 100644 --- a/how-to/feature-flags.html +++ b/how-to/feature-flags.html @@ -8,9 +8,9 @@ - - - + + +

How to use Feature Flags

In Darklang, all changes are made in production, on your real infrastructure. If diff --git a/how-to/static-assets.html b/how-to/static-assets.html index fa7721d56..f6a4b9118 100644 --- a/how-to/static-assets.html +++ b/how-to/static-assets.html @@ -8,9 +8,9 @@ - - - + + +

How to host Static Assets on Darklang

Darklang supports hosting your static assets.

diff --git a/how-to/write-tests.html b/how-to/write-tests.html index 9d80cf622..458b15aa0 100644 --- a/how-to/write-tests.html +++ b/how-to/write-tests.html @@ -8,9 +8,9 @@ - - - + + +

How to Write Tests in Darklang

At the moment, Darklang does not provide an out of the box testing framework. diff --git a/introduction.html b/introduction.html index 338af9342..58a9e83c8 100644 --- a/introduction.html +++ b/introduction.html @@ -8,9 +8,9 @@ - - - + + +

Overview of Darklang Classic

Darklang is an integrated language, framework, and editor for building web diff --git a/next/category/discussion.html b/next/category/discussion.html index 138821d23..faf80b766 100644 --- a/next/category/discussion.html +++ b/next/category/discussion.html @@ -8,9 +8,9 @@ - - - + + +

diff --git a/next/category/how-to-guides.html b/next/category/how-to-guides.html index e1cdf87e7..47631ff14 100644 --- a/next/category/how-to-guides.html +++ b/next/category/how-to-guides.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/category/reference.html b/next/category/reference.html index 9e817befa..8721c9875 100644 --- a/next/category/reference.html +++ b/next/category/reference.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/category/step-by-step-guides.html b/next/category/step-by-step-guides.html index 7c509fc0a..5cd38cb7a 100644 --- a/next/category/step-by-step-guides.html +++ b/next/category/step-by-step-guides.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/category/tutorials.html b/next/category/tutorials.html index e66446434..09cb14bc8 100644 --- a/next/category/tutorials.html +++ b/next/category/tutorials.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/changelog.html b/next/changelog.html index 5c455f946..c9fe08596 100644 --- a/next/changelog.html +++ b/next/changelog.html @@ -8,9 +8,9 @@ - - - + + +

Changelog

While we continuously deliver features as they're written, we like to diff --git a/next/discussion/base.html b/next/discussion/base.html index b109a1ee9..6fdcf16c2 100644 --- a/next/discussion/base.html +++ b/next/discussion/base.html @@ -8,9 +8,9 @@ - - - + + +

diff --git a/next/how-to/base.html b/next/how-to/base.html index 5b7731104..dec5b1b95 100644 --- a/next/how-to/base.html +++ b/next/how-to/base.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/how-to/walk-throughs/base.html b/next/how-to/walk-throughs/base.html index 6b3ea8d27..2e4daa6b2 100644 --- a/next/how-to/walk-throughs/base.html +++ b/next/how-to/walk-throughs/base.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/introduction.html b/next/introduction.html index 251b2323c..126f5adf8 100644 --- a/next/introduction.html +++ b/next/introduction.html @@ -8,9 +8,9 @@ - - - + + +

Overview

Darklang is an integrated language, framework, and editor for building web diff --git a/next/reference/cloud-framework.html b/next/reference/cloud-framework.html index 2d9aab256..d9c06e0a3 100644 --- a/next/reference/cloud-framework.html +++ b/next/reference/cloud-framework.html @@ -8,9 +8,9 @@ - - - + + +

Cloud Framework

A high level description of the set of the available cloud framework components.

diff --git a/next/reference/darklang-cli.html b/next/reference/darklang-cli.html index 317bc5671..edef3f714 100644 --- a/next/reference/darklang-cli.html +++ b/next/reference/darklang-cli.html @@ -8,9 +8,9 @@ - - - + + +

Darklang CLI

A high level description of the CLI.

diff --git a/next/reference/language-reference.html b/next/reference/language-reference.html index 2bdc3b089..812a28e72 100644 --- a/next/reference/language-reference.html +++ b/next/reference/language-reference.html @@ -8,9 +8,9 @@ - - - + + +

Language Reference

A high level description of the Darklang language.

diff --git a/next/reference/language-reference/built-in-types.html b/next/reference/language-reference/built-in-types.html index 61cce69f9..c990bcc32 100644 --- a/next/reference/language-reference/built-in-types.html +++ b/next/reference/language-reference/built-in-types.html @@ -8,9 +8,9 @@ - - - + + +

Built-In Types

The darklang type system is based on functional languages such as F#.

diff --git a/next/reference/language-reference/built-in-types/bool.html b/next/reference/language-reference/built-in-types/bool.html index 8fc102102..93b6763cb 100644 --- a/next/reference/language-reference/built-in-types/bool.html +++ b/next/reference/language-reference/built-in-types/bool.html @@ -8,9 +8,9 @@ - - - + + +

Bool

Booleans are either true or false.

diff --git a/next/reference/language-reference/built-in-types/enum.html b/next/reference/language-reference/built-in-types/enum.html index 118c38b51..c31a8f1ad 100644 --- a/next/reference/language-reference/built-in-types/enum.html +++ b/next/reference/language-reference/built-in-types/enum.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/reference/language-reference/built-in-types/int.html b/next/reference/language-reference/built-in-types/int.html index 01833cb0e..47194a538 100644 --- a/next/reference/language-reference/built-in-types/int.html +++ b/next/reference/language-reference/built-in-types/int.html @@ -8,9 +8,9 @@ - - - + + +

Int

Integers default to 64 bit signed numbers.

diff --git a/next/reference/language-reference/built-in-types/record.html b/next/reference/language-reference/built-in-types/record.html index 63c237c31..cc59933c4 100644 --- a/next/reference/language-reference/built-in-types/record.html +++ b/next/reference/language-reference/built-in-types/record.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/reference/language-reference/operators.html b/next/reference/language-reference/operators.html index 64d825e5c..5905c2861 100644 --- a/next/reference/language-reference/operators.html +++ b/next/reference/language-reference/operators.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/reference/language-reference/option-result.html b/next/reference/language-reference/option-result.html index 6fe3787d1..477788ed4 100644 --- a/next/reference/language-reference/option-result.html +++ b/next/reference/language-reference/option-result.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/reference/language-reference/type-checking.html b/next/reference/language-reference/type-checking.html index 04f199e3c..a2c087ac0 100644 --- a/next/reference/language-reference/type-checking.html +++ b/next/reference/language-reference/type-checking.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/next/tutorials/first-dark-application.html b/next/tutorials/first-dark-application.html index ad23bb3d1..c62056c2a 100644 --- a/next/tutorials/first-dark-application.html +++ b/next/tutorials/first-dark-application.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/reference/backward-compatibility.html b/reference/backward-compatibility.html index 3a9532d79..a79615e3f 100644 --- a/reference/backward-compatibility.html +++ b/reference/backward-compatibility.html @@ -8,9 +8,9 @@ - - - + + +

Backward compatibility

diff --git a/reference/cheatsheets/javascript-cheatsheet.html b/reference/cheatsheets/javascript-cheatsheet.html index 05c0d1695..9e6feb67e 100644 --- a/reference/cheatsheets/javascript-cheatsheet.html +++ b/reference/cheatsheets/javascript-cheatsheet.html @@ -8,9 +8,9 @@ - - - + + +

Javascript cheat sheet

diff --git a/reference/cheatsheets/python-cheatsheet.html b/reference/cheatsheets/python-cheatsheet.html index 94274c201..ca422811e 100644 --- a/reference/cheatsheets/python-cheatsheet.html +++ b/reference/cheatsheets/python-cheatsheet.html @@ -8,9 +8,9 @@ - - - + + +

Python Cheat Sheet

diff --git a/reference/desktop-client.html b/reference/desktop-client.html index deb09d766..3421c6762 100644 --- a/reference/desktop-client.html +++ b/reference/desktop-client.html @@ -8,9 +8,9 @@ - - - + + +

Desktop Client

If you prefer to run Darklang as an application, we offer a desktop client diff --git a/reference/faqs.html b/reference/faqs.html index 93c6726c1..7c39ff5a6 100644 --- a/reference/faqs.html +++ b/reference/faqs.html @@ -8,9 +8,9 @@ - - - + + +

FAQs

Some common questions about Darklang. Don't see what you're looking for? diff --git a/reference/framework/cron.html b/reference/framework/cron.html index d9d174817..eaccbcbbb 100644 --- a/reference/framework/cron.html +++ b/reference/framework/cron.html @@ -8,9 +8,9 @@ - - - + + +

Cron

diff --git a/reference/framework/datastores.html b/reference/framework/datastores.html index 3215f767a..e968eb663 100644 --- a/reference/framework/datastores.html +++ b/reference/framework/datastores.html @@ -8,9 +8,9 @@ - - - + + +

Datastores

diff --git a/reference/framework/http-framework.html b/reference/framework/http-framework.html index ebcef70c3..e31280a44 100644 --- a/reference/framework/http-framework.html +++ b/reference/framework/http-framework.html @@ -8,9 +8,9 @@ - - - + + +

HTTP Framework

diff --git a/reference/framework/workers.html b/reference/framework/workers.html index 14e6c1694..cd369cc37 100644 --- a/reference/framework/workers.html +++ b/reference/framework/workers.html @@ -8,9 +8,9 @@ - - - + + +

Workers

diff --git a/reference/function-reference.html b/reference/function-reference.html index f2ca540d2..a74dd4ed7 100644 --- a/reference/function-reference.html +++ b/reference/function-reference.html @@ -8,9 +8,9 @@ - - - + + +

Built-in Function reference

diff --git a/reference/httpclient.html b/reference/httpclient.html index 7e2037aa6..894fa62af 100644 --- a/reference/httpclient.html +++ b/reference/httpclient.html @@ -8,9 +8,9 @@ - - - + + +

HTTP Client

diff --git a/reference/keyboard-mapping.html b/reference/keyboard-mapping.html index 5ac25412e..175730c7a 100644 --- a/reference/keyboard-mapping.html +++ b/reference/keyboard-mapping.html @@ -8,9 +8,9 @@ - - - + + +

Keyboard Mapping

Canvas mode

diff --git a/reference/languagedetails.html b/reference/languagedetails.html index 728b4d080..25aa640c7 100644 --- a/reference/languagedetails.html +++ b/reference/languagedetails.html @@ -8,9 +8,9 @@ - - - + + +

Language Details

This doc describes the Darklang language. Darklang is really a system - a diff --git a/reference/packages.html b/reference/packages.html index 06673b099..25904cfea 100644 --- a/reference/packages.html +++ b/reference/packages.html @@ -8,9 +8,9 @@ - - - + + +

Packages

diff --git a/reference/sample-canvases.html b/reference/sample-canvases.html index 21e7e8773..55c386ffe 100644 --- a/reference/sample-canvases.html +++ b/reference/sample-canvases.html @@ -8,9 +8,9 @@ - - - + + +

Sample Canvases

We've created a set of sample canvases as examples of how build things in diff --git a/reference/sharing-dark.html b/reference/sharing-dark.html index 65c5394a0..8c2bec39b 100644 --- a/reference/sharing-dark.html +++ b/reference/sharing-dark.html @@ -8,9 +8,9 @@ - - - + + +

Sharing Darklang

Thanks for being part of our beta! We'd love for you to share your Darklang diff --git a/reference/support.html b/reference/support.html index b7bf38d90..c2f1d4ebb 100644 --- a/reference/support.html +++ b/reference/support.html @@ -8,9 +8,9 @@ - - - + + +

Support & Feedback

Support

diff --git a/reference/terms-of-service.html b/reference/terms-of-service.html index ec48cd52f..ca7f1c5e2 100644 --- a/reference/terms-of-service.html +++ b/reference/terms-of-service.html @@ -8,9 +8,9 @@ - - - + + +

Terms of Service / SLA

diff --git a/search.html b/search.html index d90a30e95..577e61145 100644 --- a/search.html +++ b/search.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/tutorials/call-external-api.html b/tutorials/call-external-api.html index 103863026..ffc17449b 100644 --- a/tutorials/call-external-api.html +++ b/tutorials/call-external-api.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Call an external API

Darklang has built-in standard libraries for working with external HTTP Calls diff --git a/tutorials/complete-first-application.html b/tutorials/complete-first-application.html index cd45b7b3c..d5c1e6e3b 100644 --- a/tutorials/complete-first-application.html +++ b/tutorials/complete-first-application.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Complete your first Darklang application

To try out the end-to-end application:

diff --git a/tutorials/create-daily-job-cron-handler.html b/tutorials/create-daily-job-cron-handler.html index 9bfe26433..8d6e17739 100644 --- a/tutorials/create-daily-job-cron-handler.html +++ b/tutorials/create-daily-job-cron-handler.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Create a daily job with a Cron handler

Now that we're storing requests, we can use a scheduled job (a "Cron", named diff --git a/tutorials/create-http-handler.html b/tutorials/create-http-handler.html index e94d6cd71..fd3c61cc1 100644 --- a/tutorials/create-http-handler.html +++ b/tutorials/create-http-handler.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Create a HTTP handler

Let's start by using the editor to write an API endpoint that responds to a diff --git a/tutorials/create-tool-repl.html b/tutorials/create-tool-repl.html index 2f197ad94..bc0fdf0b6 100644 --- a/tutorials/create-tool-repl.html +++ b/tutorials/create-tool-repl.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Create a tool in a REPL

REPLs in Darklang are general-purpose coding blocks. They're typically to create diff --git a/tutorials/extract-function.html b/tutorials/extract-function.html index f302d72fe..767449985 100644 --- a/tutorials/extract-function.html +++ b/tutorials/extract-function.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Extract code into a function

Next, we'll create the human readable summary of the daily reports. To ensure diff --git a/tutorials/first-dark-application.html b/tutorials/first-dark-application.html index 0f85f1719..7880e7424 100644 --- a/tutorials/first-dark-application.html +++ b/tutorials/first-dark-application.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Your first Darklang application

We're going to take you through a tutorial to build an entire application that diff --git a/tutorials/handle-error-errorrail.html b/tutorials/handle-error-errorrail.html index 1390ebf18..d51066e6b 100644 --- a/tutorials/handle-error-errorrail.html +++ b/tutorials/handle-error-errorrail.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Handle error messages with the Error Rail

Note: This is a self-contained tutorial and not part of the previous set.

diff --git a/tutorials/next-steps.html b/tutorials/next-steps.html index 90d71b349..33818956f 100644 --- a/tutorials/next-steps.html +++ b/tutorials/next-steps.html @@ -8,9 +8,9 @@ - - - + + +

Next steps

Now that you've completed the first application, you should be able to use diff --git a/tutorials/process-background-jobs-worker.html b/tutorials/process-background-jobs-worker.html index eeb40310b..14fcee864 100644 --- a/tutorials/process-background-jobs-worker.html +++ b/tutorials/process-background-jobs-worker.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Process background jobs in a Worker

Workers process jobs in the background, ideal for daily reports. They're also diff --git a/tutorials/save-data-to-datastore.html b/tutorials/save-data-to-datastore.html index 5adbc7704..1acd62bfa 100644 --- a/tutorials/save-data-to-datastore.html +++ b/tutorials/save-data-to-datastore.html @@ -8,9 +8,9 @@ - - - + + +

Tutorial: Save data to a Datastore

In the last section, we made a HTTP request that created a 404. We'll use the diff --git a/walk-throughs/airtable.html b/walk-throughs/airtable.html index 5c34adbc4..bb0cbdb95 100644 --- a/walk-throughs/airtable.html +++ b/walk-throughs/airtable.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Fetch and update an Airtable

This guide will walk you through how you can use Airtable’s API to add or update diff --git a/walk-throughs/external-db.html b/walk-throughs/external-db.html index 445d10ea7..f296dd872 100644 --- a/walk-throughs/external-db.html +++ b/walk-throughs/external-db.html @@ -8,9 +8,9 @@ - - - + + +

Using an External DB

Your project may require a more complex data structure than our datastores. If a diff --git a/walk-throughs/freshdesk.html b/walk-throughs/freshdesk.html index 1ba9a5a25..825b7a889 100644 --- a/walk-throughs/freshdesk.html +++ b/walk-throughs/freshdesk.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Fetch and update tickets on Freshdesk

This guide will walk you through how you can use Freshdesk’s API to access diff --git a/walk-throughs/ifttt-events.html b/walk-throughs/ifttt-events.html index fef9e72e3..fa5e98d85 100644 --- a/walk-throughs/ifttt-events.html +++ b/walk-throughs/ifttt-events.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Trigger an event on IFTTT

In this tutorial, we will create a tool that allows you to approve or deny users diff --git a/walk-throughs/react-app.html b/walk-throughs/react-app.html index a59618e1d..05629163c 100644 --- a/walk-throughs/react-app.html +++ b/walk-throughs/react-app.html @@ -8,9 +8,9 @@ - - - + + +

Walkthrough: Build a backend to a React app

Watch a demo video of this project: diff --git a/walk-throughs/slack-app.html b/walk-throughs/slack-app.html index a6df0c6ee..df7e320d6 100644 --- a/walk-throughs/slack-app.html +++ b/walk-throughs/slack-app.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Send and receive messages

Watch a diff --git a/walk-throughs/slack-asana.html b/walk-throughs/slack-asana.html index fce029cd1..d7bdc3376 100644 --- a/walk-throughs/slack-asana.html +++ b/walk-throughs/slack-asana.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Create Asana tasks and projects from Slack

Connecting your Asana account with your Slack account can make for a powerful diff --git a/walk-throughs/slack-channel-check.html b/walk-throughs/slack-channel-check.html index 826768382..98aa1b956 100644 --- a/walk-throughs/slack-channel-check.html +++ b/walk-throughs/slack-channel-check.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Check for New Slack Channels

It can be hard to keep up with all of the changes in your Slack workspace! This diff --git a/walk-throughs/slack-trello.html b/walk-throughs/slack-trello.html index 7d402a882..5b4b2ea96 100644 --- a/walk-throughs/slack-trello.html +++ b/walk-throughs/slack-trello.html @@ -8,9 +8,9 @@ - - - + + +

Walk-through: Create a New Trello Card from Slack

Connecting your Trello account with your Slack account can make for a powerful diff --git a/walk-throughs/twilio-app.html b/walk-throughs/twilio-app.html index bfae8c089..5cf88dbd6 100644 --- a/walk-throughs/twilio-app.html +++ b/walk-throughs/twilio-app.html @@ -8,9 +8,9 @@ - - - + + +