@cavuno/board 4.31.0 → 4.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/bin.mjs +31 -8
- package/dist/browser/cavuno-board.global.min.js +1 -1
- package/dist/doctor.js +31 -8
- package/dist/doctor.mjs +31 -8
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/server.d.mts +21 -16
- package/dist/server.d.ts +21 -16
- package/dist/server.js +8 -13
- package/dist/server.mjs +8 -13
- package/package.json +1 -1
- package/skills/cavuno-board-auth/SKILL.md +1 -1
- package/skills/cavuno-board-server-sessions/SKILL.md +5 -5
- package/skills/cavuno-board-setup/SKILL.md +1 -1
- package/skills/manifest.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
This changelog records changes that affect Board API compatibility, exported
|
|
4
4
|
types, runtime behavior, or supported integration patterns.
|
|
5
5
|
|
|
6
|
+
## 4.31.1 — 2026-10-01
|
|
7
|
+
|
|
8
|
+
- `createSessionRefresher` no longer shares an in-flight refresh between
|
|
9
|
+
requests. On Cloudflare Workers, a refresh started by a request that was
|
|
10
|
+
then cancelled could stay pending forever, and later requests for that
|
|
11
|
+
session waited on it. Each call now performs its own refresh; the refresh
|
|
12
|
+
endpoint returns the same successor refresh token for a token re-presented
|
|
13
|
+
within a short grace window, so concurrent refreshes converge on one
|
|
14
|
+
session. To avoid duplicate refresh calls, collapse them within a single
|
|
15
|
+
incoming request, never across requests.
|
|
16
|
+
|
|
17
|
+
- The attribution check counts a footer backlink that React streams in a late
|
|
18
|
+
Suspense segment as visible, matching how browsers and crawlers render it.
|
|
19
|
+
|
|
6
20
|
## 4.31.0 — 2026-10-01
|
|
7
21
|
|
|
8
22
|
- Board SSO supports candidate and employer sign-in through OpenID Connect and
|
package/dist/bin.mjs
CHANGED
|
@@ -8249,8 +8249,29 @@ var NON_RENDERED = /* @__PURE__ */ new Set([
|
|
|
8249
8249
|
function attribute(node, name) {
|
|
8250
8250
|
return node.attrs.find((attr) => attr.name === name)?.value;
|
|
8251
8251
|
}
|
|
8252
|
-
|
|
8253
|
-
|
|
8252
|
+
var STREAMED_REVEAL = /\$R[CR]\(\s*"[^"]+"\s*,\s*"([^"]+)"|\$RS\(\s*"([^"]+)"/g;
|
|
8253
|
+
function revealedSegmentIds(root) {
|
|
8254
|
+
const ids = /* @__PURE__ */ new Set();
|
|
8255
|
+
function visit(node) {
|
|
8256
|
+
if ("tagName" in node && node.tagName === "script") {
|
|
8257
|
+
for (const child of node.childNodes) {
|
|
8258
|
+
if (child.nodeName !== "#text") continue;
|
|
8259
|
+
const text = child.value;
|
|
8260
|
+
for (const match of text.matchAll(STREAMED_REVEAL)) {
|
|
8261
|
+
ids.add(match[1] ?? match[2]);
|
|
8262
|
+
}
|
|
8263
|
+
}
|
|
8264
|
+
return;
|
|
8265
|
+
}
|
|
8266
|
+
if ("childNodes" in node) node.childNodes.forEach(visit);
|
|
8267
|
+
}
|
|
8268
|
+
visit(root);
|
|
8269
|
+
return ids;
|
|
8270
|
+
}
|
|
8271
|
+
function hidden(node, revealed) {
|
|
8272
|
+
const id = attribute(node, "id");
|
|
8273
|
+
const streamedSegment = node.tagName === "div" && id !== void 0 && revealed.has(id);
|
|
8274
|
+
if (NON_RENDERED.has(node.tagName) || attribute(node, "hidden") !== void 0 && !streamedSegment || attribute(node, "inert") !== void 0 || attribute(node, "aria-hidden")?.toLowerCase() === "true")
|
|
8254
8275
|
return true;
|
|
8255
8276
|
const style = (attribute(node, "style") ?? "").replace(
|
|
8256
8277
|
/\/\*[\s\S]*?\*\//g,
|
|
@@ -8263,24 +8284,26 @@ function hidden(node) {
|
|
|
8263
8284
|
return property === "display" && value === "none" || property === "visibility" && ["hidden", "collapse"].includes(value) || property === "opacity" && value !== "" && Number(value.replace(/%$/, "")) === 0;
|
|
8264
8285
|
});
|
|
8265
8286
|
}
|
|
8266
|
-
function hasContent(node) {
|
|
8287
|
+
function hasContent(node, revealed) {
|
|
8267
8288
|
if (node.nodeName === "#text")
|
|
8268
8289
|
return /\S/.test(node.value);
|
|
8269
8290
|
if ("tagName" in node) {
|
|
8270
|
-
if (hidden(node)) return false;
|
|
8291
|
+
if (hidden(node, revealed)) return false;
|
|
8271
8292
|
if (node.tagName === "img") return Boolean(attribute(node, "alt")?.trim());
|
|
8272
8293
|
if (node.tagName === "svg" && attribute(node, "aria-label")?.trim())
|
|
8273
8294
|
return true;
|
|
8274
8295
|
}
|
|
8275
|
-
return "childNodes" in node && node.childNodes.some(hasContent);
|
|
8296
|
+
return "childNodes" in node && node.childNodes.some((child) => hasContent(child, revealed));
|
|
8276
8297
|
}
|
|
8277
8298
|
function hasCrawlableCavunoBacklink(html) {
|
|
8299
|
+
const root = parse(html);
|
|
8300
|
+
const revealed = revealedSegmentIds(root);
|
|
8278
8301
|
function visit(node) {
|
|
8279
8302
|
if ("tagName" in node) {
|
|
8280
|
-
if (hidden(node)) return false;
|
|
8303
|
+
if (hidden(node, revealed)) return false;
|
|
8281
8304
|
if (node.tagName === "a") {
|
|
8282
8305
|
const href = attribute(node, "href");
|
|
8283
|
-
if (href !== void 0 && hasContent(node)) {
|
|
8306
|
+
if (href !== void 0 && hasContent(node, revealed)) {
|
|
8284
8307
|
try {
|
|
8285
8308
|
const url = new URL(href);
|
|
8286
8309
|
if (["http:", "https:"].includes(url.protocol) && ["cavuno.com", "www.cavuno.com"].includes(url.hostname))
|
|
@@ -8292,7 +8315,7 @@ function hasCrawlableCavunoBacklink(html) {
|
|
|
8292
8315
|
}
|
|
8293
8316
|
return "childNodes" in node && node.childNodes.some(visit);
|
|
8294
8317
|
}
|
|
8295
|
-
return visit(
|
|
8318
|
+
return visit(root);
|
|
8296
8319
|
}
|
|
8297
8320
|
|
|
8298
8321
|
// src/doctor/read.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var CavunoBoard=(()=>{var w=Object.defineProperty;var Xt=Object.getOwnPropertyDescriptor;var eo=Object.getOwnPropertyNames;var to=Object.prototype.hasOwnProperty;var oo=(e,t,o)=>t in e?w(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var A=(e,t)=>{for(var o in t)w(e,o,{get:t[o],enumerable:!0})},no=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of eo(t))!to.call(e,r)&&r!==o&&w(e,r,{get:()=>t[r],enumerable:!(n=Xt(t,r))||n.enumerable});return e};var ro=e=>no(w({},"__esModule",{value:!0}),e);var P=(e,t,o)=>oo(e,typeof t!="symbol"?t+"":t,o);var sn={};A(sn,{ACCESS_TOKEN_KEY:()=>L,BOARD_ACCESS_GRANT_KEY:()=>F,BOARD_API_ERROR_CODES:()=>he,BoardApiError:()=>v,BoardClient:()=>I,REFRESH_TOKEN_KEY:()=>T,SDK_VERSION:()=>$,SIGN_IN_REDIRECT_ERROR_CODES:()=>ke,SSO_LINK_PROOF_BINDING_TTL_MS:()=>oe,createBoardClient:()=>ho,filters:()=>ie,format:()=>ye,isBoardApiError:()=>S,isBoardPasswordRequired:()=>Ce,isColdRule:()=>rt,isConflict:()=>Re,isForbidden:()=>Oe,isFreeEmailWebsiteError:()=>Be,isNotFound:()=>be,isOwnMessage:()=>nt,isRateLimited:()=>Pe,isSafeApplicationUrl:()=>ne,isSignInMethodUnavailable:()=>te,isSsoBrowserMismatch:()=>Ee,isSsoRequired:()=>ve,isUnauthorized:()=>Se,isValidationError:()=>_e,lastOwnMessageId:()=>it,paginate:()=>ot,parseOAuthCompletion:()=>xe,paths:()=>de,resolveApplyAction:()=>st,resolveApplyDecision:()=>re,seo:()=>fe,ssoLinkProofBindingStore:()=>D,suggest:()=>ge});var he=["internal_error","validation_bad_request","validation_payload_too_large","rate_limited","rate_limit_unavailable","search_unavailable","search_filter_unavailable","too_many_filter_values","pagination_invalid_cursor","pagination_offset_too_large","auth_unauthenticated","auth_forbidden","plan_upgrade_required","unknown_error","boards_not_found","board_page_not_found","board_auth_account_not_found","board_auth_email_taken","board_auth_invalid_credentials","board_auth_invalid_token","board_auth_registration_disabled","board_auth_token_expired","board_development_origin_not_allowed_for_email","board_development_origin_not_registered","board_development_origin_requires_publishable_key","sso_required","board_auth_method_unavailable","board_auth_sso_connection_not_found","board_auth_sso_role_unavailable","board_auth_sso_provider_unavailable","board_auth_sso_browser_mismatch","board_auth_sso_not_provisioned","board_auth_sso_identity_linked_elsewhere","invalid_current_password","no_password","same_email","email_taken","invalid_token","board_password_required","board_password_invalid","jobs_not_found","jobs_invalid_filter","categories_not_found","skills_not_found","places_not_found","locations_invalid_id","locations_unavailable","companies_not_found","company_markets_not_found","company_salary_not_found","company_category_salary_not_found","salaries_title_not_found","salaries_skill_not_found","salaries_location_not_found","salaries_title_location_not_found","salaries_skill_location_not_found","blog_post_not_found","blog_author_not_found","blog_tag_not_found","feeds_not_found","feed_not_ready","talent_not_found","talent_directory_not_found","talent_directory_restricted","job_recommendations_not_found","recommended_talent_not_found","job_alert_not_found","job_alerts_disabled","candidate_alert_limit_reached","candidate_alert_not_found","candidate_entry_not_found","candidate_handle_taken","candidate_job_not_found","candidate_notification_preference_paused","candidate_profile_required","resume_invalid_file","resume_upload_forbidden","applications_external_apply_only","applications_country_not_allowed","applications_guest_not_allowed","applications_job_not_found","applications_not_found","applications_resume_invalid_file","applications_unprocessable","messaging_application_not_found","messaging_application_not_linked","messaging_blocked","messaging_cannot_block_self","messaging_cold_rule","messaging_conversation_not_found","messaging_disabled","messaging_edit_window_expired","messaging_message_deleted","messaging_message_not_found","messaging_not_author","messaging_not_participant","messaging_not_permitted","messaging_not_recipient","messaging_rate_limited","messaging_recipient_not_found","messaging_recipient_not_open","messaging_unsend_window_expired","employer_applicant_not_found","employer_ats_unprocessable","employer_checkout_failed","employer_company_exists","employer_free_email_website","employer_company_name_taken","employer_company_not_found","employer_job_not_found","employer_job_slug_taken","employer_jobs_quota_exceeded","membership_required","employer_not_member","employer_payment_required","employer_pipeline_stage_not_found","employer_member_not_found","employer_invite_not_found","not_company_admin","not_company_member","company_deletion_disabled","last_admin","already_member","already_invited","invalid_email","invite_email_mismatch","candidate_role","job_not_published","talent_list_not_found","sourced_candidate_not_found","sourced_convert_unavailable","candidate_paywall_access_required","paywall_already_active","paywall_disabled","paywall_invalid_checkout_session","paywall_no_candidate_profile","paywall_no_recurring_subscription","paywall_offer_not_found","talent_access_unavailable","company_required","already_on_plan","talent_access_required","messaging_talent_access_required","stripe_not_connected","membership_plan_not_found","membership_seat_taken","job_posting_logo_lookup_unavailable","job_posting_logo_not_found","job_posting_rejected"],v=class extends Error{constructor(o){super(o.message);P(this,"status");P(this,"code");P(this,"details");P(this,"requestId");P(this,"raw");this.name="BoardApiError",this.status=o.status,this.code=o.code,this.details=o.details,this.requestId=o.requestId,this.raw=o.raw}};function S(e){return e instanceof Error&&e.name==="BoardApiError"&&typeof e.status=="number"&&typeof e.code=="string"}function be(e){return S(e)&&e.status===404}function Se(e){return S(e)&&e.status===401}function Ce(e){return S(e)&&e.status===401&&e.code==="board_password_required"}function Oe(e){return S(e)&&e.status===403}function _e(e){return S(e)&&e.status===400&&e.code==="validation_bad_request"}function Pe(e){return S(e)&&e.status===429}function Re(e){return S(e)&&e.status===409}function Be(e){return S(e)&&e.status===422&&e.code==="employer_free_email_website"}function ve(e){if(!S(e)||e.status!==403)return!1;let t=e.details?.connectionIds;return Array.isArray(t)&&t.every(o=>typeof o=="string")&&(e.code==="sso_required"||te(e)&&e.details.availableMethods.methods.length===0)}function te(e){if(!S(e)||e.status!==403||e.code!=="board_auth_method_unavailable")return!1;let t=e.details?.availableMethods;if(!t||typeof t!="object")return!1;let{methods:o,ssoConnectionIds:n}=t;return Array.isArray(o)&&o.every(r=>typeof r=="string")&&Array.isArray(n)&&n.every(r=>typeof r=="string")}function Ee(e){return S(e)&&e.status===403&&e.code==="board_auth_sso_browser_mismatch"}function Ae(e){let t=new URLSearchParams;if(!e)return t;for(let[o,n]of Object.entries(e))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&t.append(o,String(r));else t.append(o,String(n));return t}function J(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t+e.charCodeAt(n)>>>0;return`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}-${t.toString(36)}`}var L="cavuno_board_access_token",T="cavuno_board_refresh_token",F="cavuno_board_access_grant";function Le(){return typeof globalThis.document<"u"}function io(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,o)=>{e.set(t,o)},removeItem:t=>{e.delete(t)}}}function so(e,t){if(!Le())throw new Error(`storage mode '${e}' is browser-only \u2014 use 'nostore' + per-call headers on the server`);let o;try{if(o=e==="local"?globalThis.localStorage:globalThis.sessionStorage,!o)throw new Error("unavailable")}catch{throw new Error(`storage mode '${e}' is unavailable in this browsing context (storage access is blocked \u2014 e.g. a sandboxed or third-party iframe). Use 'memory', or 'nostore' + per-call headers.`)}let n=t?`:${J(t)}`:"";return{getItem:r=>o.getItem(`${r}${n}`),setItem:(r,i)=>{o.setItem(`${r}${n}`,i)},removeItem:r=>{o.removeItem(`${r}${n}`)}}}var ao=Symbol.for("@cavuno/board:nostore");var lo={[ao]:!0,getItem:()=>null,setItem:()=>{},removeItem:()=>{}};function Te(e,t){let o=e??(Le()?"memory":"nostore");if(typeof o=="object")return o;switch(o){case"memory":return io();case"nostore":return lo;case"local":case"session":return so(o,t);default:throw new Error(`Unknown storage mode '${String(o)}'`)}}async function N(e,t){await e.setItem(L,t.accessToken),await e.setItem(T,t.refreshToken)}async function Fe(e){await e.removeItem(L),await e.removeItem(T)}var $="4.31.0";function co(e){return typeof e=="string"||e instanceof URLSearchParams||typeof FormData<"u"&&e instanceof FormData||typeof Blob<"u"&&e instanceof Blob||e instanceof ArrayBuffer||typeof ReadableStream<"u"&&e instanceof ReadableStream}function po(e){try{let t=new URL(e);for(let o of new Set(t.searchParams.keys()))t.searchParams.delete(o),t.searchParams.set(o,"[REDACTED]");return t.toString()}catch{return e.replace(/([?&][^=&#]+)=([^&#]*)/g,"$1=[REDACTED]")}}var I=class{constructor(t){P(this,"storage");P(this,"basePath");P(this,"options");this.options=t,this.storage=t.storage;let o=t.baseUrl.replace(/\/+$/,"");this.basePath=`${o}/v1/boards/${encodeURIComponent(t.board)}`}async fetch(t,o={}){let{body:n,query:r,headers:i,...s}=o,a=(o.method??"GET").toUpperCase(),l=`${this.basePath}${t}`,p=Ae(r).toString();p&&(l+=`?${p}`);let m=n!==void 0&&!co(n),d=n===void 0?void 0:m?JSON.stringify(n):n,y=new Headers({accept:"application/json"});m&&y.set("content-type","application/json");for(let[B,ee]of Object.entries(this.options.globalHeaders??{}))y.set(B,ee);let f=await this.storage.getItem(L);f!==null&&y.set("authorization",`Bearer ${f}`);let O=await this.storage.getItem(F);O!==null&&y.set("x-board-access",O),i&&new Headers(i).forEach((B,ee)=>{y.set(ee,B)}),(a!=="GET"||y.has("authorization")||y.has("x-board-access"))&&!y.has("x-cavuno-sdk")&&y.set("x-cavuno-sdk",`board@${$}`);let g={url:l,init:{...s,method:a,headers:y,body:d}};this.options.onRequest&&(g=await this.options.onRequest(g));let R=po(g.url);this.options.logger?.debug(`${a} ${R}`);let u=await globalThis.fetch(g.url,g.init);if(this.options.logger?.debug(`${u.status} ${a} ${R}`),this.options.onResponse&&await this.options.onResponse(u.clone(),g),u.status===204)return;if(u.ok)return await u.json();let b;try{b=await u.json()}catch{b=void 0}let _=b?.error,E=_&&typeof _.code=="string"&&typeof _.message=="string"?new v({status:u.status,code:_.code,message:_.message,details:_.details,requestId:_.requestId,raw:b}):new v({status:u.status,code:"unknown_error",message:u.statusText||"Request failed",raw:b});throw this.options.logger?.error(`${E.status} ${E.code} ${a} ${R}`),E}};var Ie="https://api.cavuno.com";var ke=["oauth_cancelled","oauth_failed","oauth_email_unverified","role_disabled","method_unavailable","sso_required","sso_state_invalid","sso_cancelled","sso_failed","sso_connection_unavailable","sso_not_provisioned","sso_email_required","sso_account_disabled","sso_identity_linked_elsewhere","sso_link_proof_rate_limited","sso_development_origin_not_allowed_for_email"];function uo(e){if(e instanceof URLSearchParams)return e;if(typeof e=="string"){let o=e.includes("?")?e.slice(e.indexOf("?")):e;return new URLSearchParams(o)}let t=new URLSearchParams;for(let[o,n]of Object.entries(e))n!==void 0&&t.set(o,n);return t}function mo(e){return!e||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\")||e.includes("://")||/[\u0000-\u001F\u007F]/.test(e)?"/":e}function yo(e){return e==="candidate"||e==="employer"?e:null}function xe(e){let t=uo(e),o=c=>{let p=t.get(c);return p&&p.length>0?p:null},n=mo(o("returnTo")),r=yo(o("role")),i=o("error");if(i)return{kind:"error",error:i,returnTo:n};let s=o("linkProof");if(s)return{kind:"link_proof",linkProof:s,role:r,returnTo:n};let a=o("linkProofBinding");if(o("status")==="sso_link_proof_sent"&&a)return{kind:"link_proof_sent",linkProofBinding:a,role:r,returnTo:n};let l=o("token");return l?{kind:"token",token:l,method:o("method"),role:r,returnTo:n,isNewUser:o("isNew")==="1"}:{kind:"invalid",returnTo:n}}var oe=1500*1e3,fo="cavuno_board_sso_link_proof_binding";function go(){try{return globalThis.localStorage??null}catch{return null}}function D(e,t={}){let o=`${fo}:${J(e)}`,n=t.now??Date.now,r=()=>t.storage??go(),i=()=>{try{r()?.removeItem(o)}catch{}};return{begin(){let s=globalThis.crypto.getRandomValues(new Uint8Array(32)),a=Array.from(s,c=>c.toString(16).padStart(2,"0")).join(""),l=r();if(!l)throw new Error("SSO requires browser storage or an explicit browser proof");return l.setItem(o,JSON.stringify({binding:a,expiresAt:n()+oe})),a},save(s){},read(){let s=null;try{s=r()?.getItem(o)??null}catch{return null}if(!s)return null;try{let a=JSON.parse(s);if(typeof a.binding=="string"&&typeof a.expiresAt=="number"&&a.expiresAt>n())return a.binding}catch{}return i(),null},clear:i}}function Ue(e,t=""){let o=()=>D(t);async function n(i){return await N(e.storage,i),i}async function r(i){if(i?.refreshToken)return i.refreshToken;let s=await e.storage.getItem(T);if(s===null)throw new Error("No refresh token available \u2014 pass { refreshToken } or configure auth.storage");return s}return{async register(i,s){let a=await e.fetch("/auth/register",{...s,method:"POST",body:i});return n(a)},async login(i,s){let a=await e.fetch("/auth/login",{...s,method:"POST",body:i});return n(a)},async refresh(i,s){let a=await r(i),l=await e.fetch("/auth/refresh",{...s,method:"POST",body:{refreshToken:a}});return n(l)},async logout(i,s){let a=await r(i);await e.fetch("/auth/logout",{...s,method:"POST",body:{refreshToken:a}}),await Fe(e.storage)},verifyEmail(i,s){return e.fetch("/auth/verify-email",{...s,method:"POST",body:i})},verifyWorkEmail(i,s){return e.fetch("/auth/verify-work-email",{...s,method:"POST",body:i})},verifyEmailWithCode(i,s){return e.fetch("/auth/verify-email/otp",{...s,method:"POST",body:i})},resendVerification(i){return e.fetch("/auth/verify-email/resend",{...i,method:"POST"})},forgotPassword(i,s){return e.fetch("/auth/forgot-password",{...s,method:"POST",body:i})},resetPassword(i,s){return e.fetch("/auth/reset-password",{...s,method:"POST",body:i})},requestMagicLink(i,s){return e.fetch("/auth/magic-link",{...s,method:"POST",body:i})},async consumeMagicLink(i,s){let a=await e.fetch("/auth/magic-link/consume",{...s,method:"POST",body:i});return n(a)},getOAuthAuthorizationUrl(i,s,a){return e.fetch(`/auth/oauth/${i}`,{...a,method:"GET",query:s})},async exchangeOAuth(i,s){let a=await e.fetch("/auth/oauth/exchange",{...s,method:"POST",body:{...i,browserBinding:i.browserBinding??o().read()??void 0}});return n(a)},async getSsoAuthorizationUrl(i,s,a){let l=s?.browserBindingHash;if(!l){let c=o().begin(),p=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(c));l=Array.from(new Uint8Array(p),m=>m.toString(16).padStart(2,"0")).join("")}return e.fetch(`/auth/sso/${encodeURIComponent(i)}`,{...a,method:"GET",query:{...s,browserBindingHash:l}})},async consumeSsoLinkProof(i,s){let a=await e.fetch("/auth/sso/link-proof",{...s,method:"POST",body:{...i,browserBinding:i.browserBinding??o().read()??void 0}});return n(a)}}}function Me(e){return{posts:{list(t,o){return e.fetch("/blog/posts",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}`,{...n,query:o})},adjacent(t,o){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/adjacent`,o)},similar(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/similar`,{...n,query:o})}},tags:{list(t,o){return e.fetch("/blog/tags",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/tags/${encodeURIComponent(t)}`,{...n,query:o})}},authors:{list(t,o){return e.fetch("/blog/authors",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/authors/${encodeURIComponent(t)}`,{...n,query:o})}},search(t,o,n){return e.fetch("/blog/search",{...n,method:"POST",body:t,query:o})}}}function we(e){let t=Object.assign((n,r)=>e.fetch("/companies/markets",{...r,query:n}),{resolve(n,r){return e.fetch(`/companies/markets/${encodeURIComponent(n)}`,r)}}),o=Object.assign((n,r)=>e.fetch(`/companies/${encodeURIComponent(n)}/salaries`,r),{summary(n,r){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/summary`,r)},category(n,r,i,s){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/${encodeURIComponent(r)}`,{...s,query:i})}});return{list(n,r){return e.fetch("/companies",{...r,query:n})},retrieve(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}`,{...i,query:r})},search(n,r,i){return e.fetch("/companies/search",{...i,method:"POST",body:n,query:r})},listJobs(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/jobs`,{...i,query:r})},similar(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/similar`,{...i,query:r})},markets:t,salaries:o}}function Je(e){return{jobs(t,o){return e.fetch("/embed/jobs",{...o,query:t})}}}function Ne(e){return{subscribe(t,o){return e.fetch("/job-alerts",{...o,method:"POST",body:t})},confirm(t,o){return e.fetch("/job-alerts/confirm",{...o,method:"POST",body:t})},resendConfirmation(t,o){return e.fetch("/job-alerts/resend-confirmation",{...o,method:"POST",body:t})},manage(t,o){return e.fetch("/job-alerts/manage",{...o,query:t})},unsubscribe(t,o){return e.fetch("/job-alerts/unsubscribe",{...o,method:"POST",body:t})},resubscribe(t,o){return e.fetch("/job-alerts/resubscribe",{...o,method:"POST",body:t})},updatePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"POST",body:t})},deletePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"DELETE",body:t})}}}function $e(e){return{plans(t,o){return e.fetch("/job-postings/plans",{...o,query:t})},create(t,o){return e.fetch("/job-postings",{...o,method:"POST",body:t})},uploadLogo(t,o){let n=new FormData;return n.append("file",t),e.fetch("/job-postings/logo",{...o,method:"POST",body:n})},fetchLogoByDomain(t,o){return e.fetch("/job-postings/logo/fetch",{...o,query:{domain:t}})},sendBillingVerification(t,o){return e.fetch("/job-postings/send-verification",{...o,method:"POST",body:t})},getBillingOptions(t,o){return e.fetch("/job-postings/billing-options",{...o,method:"POST",body:t})}}}function De(e){return{collectionChoices(t,o,n){return e.fetch(`/job-fields/${encodeURIComponent(t)}/choices`,{...n,query:o})},list(t,o){return e.fetch("/jobs",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}`,{...n,query:o})},search(t,o,n){return e.fetch("/jobs/search",{...n,method:"POST",body:t,query:o})},similar(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/similar`,{...n,query:o})},apply(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply`,{...n,method:"POST",body:o??{}})},createApplyIntent(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply-intents`,{...n,method:"POST",body:o})},prepareApplyApproval(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply-approvals`,{...n,method:"POST",body:o})},uploadApplicationResume(t,o,n,r){let i=new FormData;return i.append("file",o),n?.applicationId&&i.append("applicationId",n.applicationId),e.fetch(`/jobs/${encodeURIComponent(t)}/apply/resume`,{...r,method:"POST",body:i})},myApplication(t,o){return e.fetch(`/jobs/${encodeURIComponent(t)}/application`,o)}}}function je(e){return{search(t,o){return e.fetch("/locations/search",{...o,query:t})},resolve(t,o){return e.fetch("/locations/resolve",{...o,method:"POST",body:t})}}}function Qe(e){return{retrieve(t,o){return e.fetch("/me",{...o,query:t})},delete(t){return e.fetch("/me",{...t,method:"DELETE"})},async updatePassword(t,o){let n=await e.fetch("/me/password",{...o,method:"POST",body:t});return await N(e.storage,n),n},requestEmailChange(t,o){return e.fetch("/me/email",{...o,method:"POST",body:t})},confirmEmailChange(t,o){return e.fetch("/me/email/confirm",{...o,method:"POST",body:t})},acceptInvite(t,o){return e.fetch("/me/invites/accept",{...o,method:"POST",body:t})},profile:{listObjectReferenceChoices(t,o,n){return e.fetch("/me/profile/object-references/choices",{...n,query:{...o,fieldKey:t}})},retrieve(t,o){return e.fetch("/me/profile",{...o,query:t})},update(t,o,n){return e.fetch("/me/profile",{...n,method:"PATCH",body:t,query:o})},retrieveCustomFields(t){return e.fetch("/me/profile/custom-fields",{...t})},updateCustomFields(t,o){return e.fetch("/me/profile/custom-fields",{...o,method:"PATCH",body:t})},retrieveObjectReferences(t){return e.fetch("/me/profile/object-references",t)},updateObjectReferences(t,o){return e.fetch("/me/profile/object-references",{...o,method:"PUT",body:t})},handleAvailable(t,o){return e.fetch("/me/profile/handle-available",{...o,query:{handle:t}})},listExperience(t){return e.fetch("/me/profile/experience",t)},createExperience(t,o){return e.fetch("/me/profile/experience",{...o,method:"POST",body:t})},updateExperience(t,o,n){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteExperience(t,o){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listEducation(t){return e.fetch("/me/profile/education",t)},createEducation(t,o){return e.fetch("/me/profile/education",{...o,method:"POST",body:t})},updateEducation(t,o,n){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteEducation(t,o){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listSkills(t){return e.fetch("/me/profile/skills",t)},updateSkills(t,o){return e.fetch("/me/profile/skills",{...o,method:"PUT",body:t})},listLanguages(t){return e.fetch("/me/profile/languages",t)},updateLanguages(t,o){return e.fetch("/me/profile/languages",{...o,method:"PUT",body:t})},uploadAvatar(t,o){let n=new FormData;return n.append("file",t),e.fetch("/me/profile/avatar",{...o,method:"POST",body:n})}},notificationPreferences:{retrieve(t){return e.fetch("/me/notification-preferences",t)},update(t,o){return e.fetch("/me/notification-preferences",{...o,method:"PUT",body:t})},unsubscribeWithToken(t,o){return e.fetch("/me/notification-preferences/unsubscribe",{...o,method:"POST",body:t})}},companies:{listObjectReferenceChoices(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references/choices`,{...r,query:{...n,fieldKey:o}})},retrieveObjectReferences(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references`,o)},updateObjectReferences(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references`,{...n,method:"PUT",body:o})},search(t,o){return e.fetch("/me/companies/search",{...o,query:t})},list(t){return e.fetch("/me/companies",t)},create(t,o){return e.fetch("/me/companies",{...o,method:"POST",body:t})},claim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"POST"})},cancelClaim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"DELETE"})},retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},retrieveCustomFields(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/custom-fields`,o)},updateCustomFields(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/custom-fields`,{...n,method:"PATCH",body:o})},delete(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listMembers(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members`,o)},updateMemberRole(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},removeMember(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},leave(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership`,{...o,method:"DELETE"})},startMembershipCheckout(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership/checkout`,{...n,method:"POST",body:o})},retrieveMembershipCheckout(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership/checkout/${encodeURIComponent(o)}`,n)},listInvites(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites`,o)},createInvite(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites`,{...n,method:"POST",body:o})},revokeInvite(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},uploadLogo(t,o,n){let r=new FormData;return r.append("file",o),e.fetch(`/me/companies/${encodeURIComponent(t)}/logo`,{...n,method:"POST",body:r})},workEmail:{verify(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/verify`,{...n,method:"POST",body:o})},confirm(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/confirm`,{...n,method:"POST",body:o})}},jobs:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,query:o})},retrieve(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,n)},create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},delete(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},publish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/publish`,{...n,method:"POST"})},unpublish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/unpublish`,{...n,method:"POST"})},checkout(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/checkout`,{...r,method:"POST",body:n})}},billingOptions:{list(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/billing-options`,o)}},billingPortal:{create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/billing-portal`,{...n,method:"POST",body:o})}},jobStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats/timeseries`,{...n,query:o})}},profileStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats/timeseries`,{...n,query:o})}},recommendedTalent:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/recommended-talent`,{...n,query:o})}},talentLists:{list(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists`,o)},create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists/${encodeURIComponent(o)}`,{...n,method:"DELETE"})}},sourcedCandidates:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates`,{...n,query:o})},add(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates`,{...n,method:"POST",body:o})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},convert(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates/${encodeURIComponent(o)}/convert`,{...r,method:"POST",body:n})}},applicants:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants`,{...n,query:o})},move(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/stage`,{...r,method:"PATCH",body:n})},bulkMove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/move`,{...n,method:"POST",body:o})},bulkReject(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/reject`,{...n,method:"POST",body:o})},addNote(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/notes`,{...r,method:"POST",body:n})}},pipelineStages:{create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},reorder(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/reorder`,{...n,method:"PUT",body:o})}}},talentAccess:{retrieve(t){return e.fetch("/me/talent-access",t)},retrieveCandidate(t,o){return e.fetch(`/me/talent-access/candidates/${encodeURIComponent(t)}`,o)},checkout(t,o){return e.fetch("/me/talent-access/checkout",{...o,method:"POST",body:t})},claim(t,o){return e.fetch("/me/talent-access/claim",{...o,method:"POST",body:t})},retrieveCheckout(t,o){return e.fetch(`/me/talent-access/checkout/${encodeURIComponent(t)}`,o)},unlock(t,o){return e.fetch("/me/talent-access/unlocks",{...o,method:"POST",body:t})},upgrade(t,o){return e.fetch("/me/talent-access/upgrade",{...o,method:"POST",body:t})}},alerts:{list(t){return e.fetch("/me/alerts",t)},create(t,o){return e.fetch("/me/alerts",{...o,method:"POST",body:t})},retrieve(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...n,method:"PUT",body:o})},remove(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...o,method:"DELETE"})}},applications:{list(t,o){return e.fetch("/me/applications",{...o,query:t})},retrieve(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,o)},updateFacts(t,o,n){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},withdraw(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}/withdraw`,{...o,method:"POST"})}},resume:{upload(t,o,n){let r=new FormData;return r.append("resume",t),o?.keepResumeOnFile&&r.append("keepResumeOnFile","true"),o?.importMode&&r.append("importMode",o.importMode),o?.confirmReplaceAll&&r.append("confirmReplaceAll","true"),e.fetch("/me/resume",{...n,method:"POST",body:r})},retrieve(t){return e.fetch("/me/resume",t)},delete(t){return e.fetch("/me/resume",{...t,method:"DELETE"})}},recommendedJobs:{list(t,o){return e.fetch("/me/recommended-jobs",{...o,query:t})}},savedJobs:{list(t,o){return e.fetch("/me/saved-jobs",{...o,query:t})},save(t,o,n){return e.fetch("/me/saved-jobs",{...n,method:"POST",body:t,query:o})},unsave(t,o,n){return e.fetch(`/me/saved-jobs/${encodeURIComponent(t)}`,{...n,method:"DELETE",query:o})}},conversations:{list(t,o){return e.fetch("/me/conversations",{...o,query:t})},unreadCount(t){return e.fetch("/me/conversations/unread-count",t)},retrieve(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}`,o)},listMessages(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/messages`,{...n,query:o})},start(t,o){return e.fetch("/me/conversations",{...o,method:"POST",body:t})},startAboutApplication(t,o){return e.fetch("/me/conversations/about-application",{...o,method:"POST",body:t})},reply(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/reply`,{...n,method:"POST",body:o})},markRead(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/read`,{...o,method:"POST"})},archive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/archive`,{...o,method:"POST"})},unarchive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/unarchive`,{...o,method:"POST"})},findExisting(t,o){return e.fetch("/me/conversations/find-existing",{...o,query:t})}},blocks:{list(t){return e.fetch("/me/blocks",t)},create(t,o){return e.fetch("/me/blocks",{...o,method:"POST",body:t})},remove(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},status(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,o)}},messages:{edit(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},unsend(t,o){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},report(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}/report`,{...n,method:"POST",body:o})}},marketingConsent:{retrieve(t){return e.fetch("/me/marketing-consent",t)},grant(t){return e.fetch("/me/marketing-consent/grant",{...t,method:"POST"})},withdraw(t){return e.fetch("/me/marketing-consent/withdraw",{...t,method:"POST"})}},access:{checkout(t,o){return e.fetch("/me/access/checkout",{...o,method:"POST",body:t})},retrieveCheckout(t,o){return e.fetch(`/me/access/checkout/${encodeURIComponent(t)}`,o)},grant(t){return e.fetch("/me/access/grant",t)},portal(t,o){return e.fetch("/me/access/portal",{...o,method:"POST",body:t})}}}}function qe(e){return{async verify(t,o){let n=await e.fetch("/password/verify",{...o,method:"POST",body:{password:t}});return await e.storage.setItem(F,n.token),n}}}function Ge(e){return{offers(t){return e.fetch("/paywall/offers/enabled",t)}}}function He(e){return{list(t,o){return e.fetch("/plans",{...o,query:t})},salesLed(t){return e.fetch("/sales-led-plans",t)}}}function Ve(e){return{retrieve(t,o){return e.fetch(`/profile-fields/${encodeURIComponent(t)}`,o)},choices(t,o,n,r){return e.fetch(`/profile-fields/${encodeURIComponent(t)}/${encodeURIComponent(o)}/choices`,{...r,query:n})}}}function Ke(e){return{resolve(t,o){return e.fetch("/redirects/resolve",{...o,query:{path:t}})}}}function Ye(e){return{companies:{list(t){return e.fetch("/salaries/companies",t)}},titles:{list(t,o){return e.fetch("/salaries/titles",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},skills:{list(t,o){return e.fetch("/salaries/skills",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},locations:{list(t,o){return e.fetch("/salaries/locations",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}`,{...n,query:o})},titles(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/titles`,{...n,query:o})},skills(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/skills`,{...n,query:o})}}}}function ze(e){return{suggest(t,o){return e.fetch("/search/suggest",{...o,query:t})}}}function We(e){return Object.assign(t=>e.fetch("/sitemap",t),{entries(t,o,n){return e.fetch(`/sitemap/${encodeURIComponent(t)}`,{...n,query:o})}})}function Ze(e){return{list(t,o){let n=t?{...t,customFields:t.customFields?JSON.stringify(t.customFields):void 0,objectReferences:t.objectReferences?JSON.stringify(t.objectReferences):void 0}:void 0;return e.fetch("/talent",{...o,query:n})},retrieve(t,o){return e.fetch(`/talent/${encodeURIComponent(t)}`,o)}}}function et(e,t){return{resolve(o,n){return e.fetch(`/${t}/${encodeURIComponent(o)}`,n)}}}function Xe(e,t){return{...et(e,t),list(o,n){return e.fetch(`/${t}`,{...n,query:o})}}}function tt(e){return{categories:Xe(e,"categories"),skills:Xe(e,"skills"),remotePermits:{list(t){return e.fetch("/remote-permits",t)}},places:{...et(e,"places"),list(t,o){return e.fetch("/places",{...o,query:t})}}}}function ot(e,t,o){async function*n(){let r=t;for(;;){let i=await e(r,o);if(yield i,!i.hasMore||i.nextCursor===null)return;let{offset:s,...a}=r??{};r={...a,cursor:i.nextCursor}}}return{pages:n,async*[Symbol.asyncIterator](){for await(let r of n())yield*r.data},async toArray({limit:r}){let i=[];for await(let s of n())if(i.push(...s.data),i.length>=r)break;return i.slice(0,r)}}}function nt(e,t){return e.authorBoardUserId!==t}function rt(e,t){let o=e.some(r=>r.authorBoardUserId===t);return e.some(r=>r.authorBoardUserId!==t)&&!o}function it(e,t){for(let o=e.length-1;o>=0;o--){let n=e[o];if(n.authorBoardUserId!==t)return n.id}return null}function ne(e){let t=e.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,"").replace(/[\t\n\r]/g,""),o=/^([a-z][a-z0-9+.-]*):/i.exec(t)?.[1]?.toLowerCase();return o===void 0?!0:o==="http"||o==="https"||o==="mailto"}function re(e){let t=e.applicationUrl&&ne(e.applicationUrl)?e.applicationUrl:null;return!t&&!e.jobSlug?{kind:"none"}:e.registrationWall&&!e.viewer?{kind:"sign-in",reason:"registration-wall"}:t?{kind:"external",url:t}:e.jobSlug?e.viewer?e.viewer.emailVerified?e.applied?{kind:"applied"}:{kind:"native",jobSlug:e.jobSlug}:{kind:"verify-email"}:e.allowGuestApply?{kind:"guest",jobSlug:e.jobSlug}:{kind:"sign-in",reason:"native-apply"}:{kind:"none"}}function st(e){let t=re({...e,registrationWall:!1,allowGuestApply:!1});return t.kind==="sign-in"?{kind:"sign-in"}:t}function ho(e){let t=new I({baseUrl:e.baseUrl??Ie,board:e.board,storage:Te(e.auth?.storage,e.board),globalHeaders:e.globalHeaders,onRequest:e.onRequest,onResponse:e.onResponse,logger:e.logger});return{client:t,context(o){return t.fetch("",o)},seo(o){return t.fetch("/seo",o)},jobs:De(t),embed:Je(t),companies:we(t),blog:Me(t),auth:Ue(t,e.board),me:Qe(t),password:qe(t),taxonomy:tt(t),search:ze(t),locations:je(t),redirects:Ke(t),jobAlerts:Ne(t),jobPosting:$e(t),salaries:Ye(t),talent:Ze(t),profileFields:Ve(t),plans:He(t),paywall:Ge(t),sitemap:We(t)}}var ie={};A(ie,{DEFAULT_SORT:()=>bo,EMPLOYMENT_TYPES:()=>lt,JOB_SORTS:()=>pt,REMOTE_OPTIONS:()=>at,SENIORITIES:()=>ct,parseCategory:()=>dt,parseCompany:()=>mt,parseListingFilters:()=>Co,parseSeniority:()=>ut});var at=["on_site","hybrid","remote"],lt=["full_time","part_time","contract","internship","temporary"],ct=["entry_level","associate","mid_level","senior","lead","principal","director","executive"],pt=["relevance","newest","salary_high"],bo="relevance";var So=new Set(ct);function ut(e){let t=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],o=[],n=new Set;for(let r of t){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");!i||n.has(i)||So.has(i)&&(n.add(i),o.push(i))}return o.length>0?o:void 0}function mt(e){return yt(e,10)}function dt(e){return yt(e,10)}function yt(e,t){let o=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],n=[],r=new Set;for(let i of o){if(typeof i!="string")continue;let s=i.trim().toLowerCase().normalize("NFC");if(!(!s||r.has(s))&&(r.add(s),n.push(s),n.length>=t))break}return n.length>0?n:void 0}function Co(e){return{q:typeof e.q=="string"&&e.q?e.q:void 0,remoteOption:at.includes(e.remoteOption)?e.remoteOption:void 0,employmentType:lt.includes(e.employmentType)?e.employmentType:void 0,seniority:ut(e.seniority),company:mt(e.company),category:dt(e.category),sort:pt.includes(e.sort)?e.sort:void 0}}var ye={};A(ye,{COUNTRY_CODES:()=>Z,buildJobBreadcrumbs:()=>W,countryOptions:()=>Ht,formatDate:()=>St,formatMonthYear:()=>Ot,formatPublishedRelativeDate:()=>Ct,formatSalaryRange:()=>_t,formatSalaryStat:()=>q,formatSalaryStatRange:()=>k,normalizeWebsiteUrl:()=>U,resolveCustomFieldDisplay:()=>Vt});function C(e){let t=e.trim();if(!t)return null;try{let o=t.replace(/_/g,"-"),[n]=Intl.getCanonicalLocales(o);if(!n)return null;let[r]=Intl.NumberFormat.supportedLocalesOf([n]);return r??null}catch{return null}}var ft=new Map,gt=new Map,ht=new Map,bt=new Map;function Oo(e){let t=ft.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"always",style:"short"}),ft.set(e,t)),t}function _o(e){let t=gt.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"auto",style:"short"}),gt.set(e,t)),t}function Po(e){let t=ht.get(e);return t||(t=new Intl.DateTimeFormat(e,{dateStyle:"medium",timeZone:"UTC"}),ht.set(e,t)),t}function Ro(e){let t=bt.get(e);return t||(t=new Intl.DateTimeFormat(e,{month:"short",year:"numeric",timeZone:"UTC"}),bt.set(e,t)),t}function se(e,t,o){try{return Oo(o).format(e,t)}catch{return null}}function St(e,t){if(!t)return null;let o=new Date(t);if(Number.isNaN(o.getTime()))return null;let n=C(e);if(!n)return null;try{return Po(n).format(o)}catch{return o.toISOString().split("T")[0]}}function Ct(e,t,o=Date.now()){if(!t)return null;let n=new Date(t);if(Number.isNaN(n.getTime()))return null;let r=C(e);if(!r)return null;let i=o-n.getTime(),s=Math.abs(i),a=60*1e3,l=60*a,c=24*l,p=7*c,m=30*c,d=365*c;if(s<a)try{return _o(r).format(0,"second")}catch{return se(0,"second",r)}let y=[{unit:"year",ms:d},{unit:"month",ms:m},{unit:"week",ms:p},{unit:"day",ms:c},{unit:"hour",ms:l},{unit:"minute",ms:a}];for(let g of y)if(s>=g.ms){let R=Math.round(s/g.ms),u=i>=0?-R:R;return se(u,g.unit,r)}let f=Math.round(s/1e3),O=i>=0?-f:f;return se(O,"second",r)}function Ot(e,t){if(!t)return null;let n=/^\d{4}-\d{2}(-\d{2})?$/.test(t)?new Date(t.length===7?`${t}-01T00:00:00.000Z`:`${t}T00:00:00.000Z`):new Date(t);if(Number.isNaN(n.getTime()))return null;let r=C(e);if(!r)return null;try{return Ro(r).format(n)}catch{return null}}var j=new Map;function ae(e,t,o,n="symbol",r="compact"){let i=`${t}:${o}:${n}:${r}`,s=j.get(i);if(s===void 0){try{let a={style:"currency",currency:o,currencyDisplay:n,notation:r};r==="compact"&&(a.compactDisplay="short",a.maximumFractionDigits=1,a.minimumFractionDigits=0),s=new Intl.NumberFormat(t,a)}catch{s=null}j.set(i,s)}return s?s.format(e):null}function le(e,t,o){if(typeof e.formatRange=="function")try{return e.formatRange(t,o)}catch{}try{return`${e.format(t)}\u2013${e.format(o)}`}catch{return null}}function Bo(e,t,o,n,r="symbol",i="compact"){let s=`${o}:${n}:${r}:${i}:range`,a=j.get(s);if(a===void 0){try{let l={style:"currency",currency:n,currencyDisplay:r,notation:i};i==="compact"&&(l.compactDisplay="short",l.maximumFractionDigits=1,l.minimumFractionDigits=0),a=new Intl.NumberFormat(o,l)}catch{a=null}j.set(s,a)}return a?le(a,e,t):null}var vo=new Set(["per_year","per_month","per_week","per_day","per_hour"]);function Eo(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function _t(e,t,o,n,r=null,i="symbol",s){let a=t==null||Number.isFinite(t),l=o==null||Number.isFinite(o);if(!a||!l||t==null&&o==null)return null;let c=r?.trim().toUpperCase()||null;if(!c)return null;let p=C(e);if(!p)return null;let m=s??Eo(t,o),d=typeof n=="string"&&vo.has(n)?n:null;if(t!=null&&o!=null){let f=t<=o?t:o,O=t<=o?o:t,g=f===O?ae(f,p,c,i,m):Bo(f,O,p,c,i,m);return g?{text:g,timeframe:d,bound:"range"}:null}if(t!=null){let f=ae(t,p,c,i,m);return f?{text:f,timeframe:d,bound:"from"}:null}let y=ae(o,p,c,i,m);return y?{text:y,timeframe:d,bound:"upTo"}:null}var Pt=new Map;function Rt(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function Bt(e,t,o){let n=`${e}:${t}:${o}`,r=Pt.get(n);if(r!==void 0)return r;let i;try{let s={style:"currency",currency:t,notation:o};o==="compact"&&(s.compactDisplay="short",s.minimumFractionDigits=0,s.maximumFractionDigits=1),i=new Intl.NumberFormat(e,s)}catch{i=null}return Pt.set(n,i),i}function q(e,t,o,n){if(!Number.isFinite(t))return null;let r=o?.trim().toUpperCase()||null;if(!r)return null;let i=C(e);if(!i)return null;let s=n??Rt(t),a=Bt(i,r,s);return a?a.format(t):null}function k(e,t,o,n,r){if(!Number.isFinite(t)||!Number.isFinite(o))return null;let i=n?.trim().toUpperCase()||null;if(!i)return null;let s=C(e);if(!s)return null;let a=r??Rt(t,o),l=Bt(s,i,a);if(!l)return null;let c=Math.min(t,o),p=Math.max(t,o);return c===p?l.format(c):le(l,c,p)}var Q=["entry_level","associate","mid_level","senior","lead","principal","director","executive"];function vt(e){return[...e].sort((t,o)=>{let n=Q.indexOf(t.seniority),r=Q.indexOf(o.seniority);return(n===-1?999:n)-(r===-1?999:r)})}var Ao={unitText:"YEAR",duration:"P1Y"};function x(e,t,o,n,r={}){return{"@type":"MonetaryAmountDistribution",...e!==void 0?{name:e}:{},currency:t,minValue:o,maxValue:n,...r,...Ao}}function ce(e,t,o,n){return e.map(r=>{let i=n?.seniorityName?.({seniority:r.seniority,entity:o});return x(i,t,r.avgSalaryMin,r.avgSalaryMax)})}function G(e,t,o,n){return{"@context":"https://schema.org","@type":e,name:t,...o,estimatedSalary:n}}function Et(e,t,o,n){if(!o)return[];let r=k(e,o.avgMin,o.avgMax,n);return[{kind:"average",label:t,range:r,avgMin:o.avgMin,avgMax:o.avgMax,currency:n,jobCount:o.jobCount},{kind:"methodology",label:t}]}function H(e){return e.length===0?null:{"@context":"https://schema.org","@type":"ItemList",numberOfItems:e.length,itemListElement:e.map((t,o)=>({"@type":"ListItem",position:o+1,name:t.name,url:t.url}))}}function At(e){return e.length===0?null:{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(t=>({"@type":"Question",name:t.q,acceptedAnswer:{"@type":"Answer",text:t.a}}))}}function Lt(e,t){return e.overallSalary?G("Occupation",e.categoryName,{},[x(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardP25Min?{percentile25:e.boardP25Min}:{},...e.boardP75Max?{percentile75:e.boardP75Max}:{}}),...ce(e.bySeniority,e.currency,e.categoryName,t)]):null}function Tt(e){return e.overallSalary?G("Occupation",e.skillName,{},[x(e.skillName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{median:Math.round((e.overallSalary.medianMin+e.overallSalary.medianMax)/2)})]):null}function Ft(e,t){return!t?.occupationUrl||!(e.adminLevel==="city"||e.adminLevel==="locality")?null:H(e.topCategories.map(n=>({name:n.categoryName,url:t.occupationUrl(n)})))}function It(e,t){return e.overall?G("Occupation",e.name,{occupationLocation:{"@type":"AdministrativeArea",name:e.placeName,address:{"@type":"PostalAddress",addressCountry:e.countryCode}}},[x(e.name,e.currency,e.overall.avgMin,e.overall.avgMax,{...e.overall.p25Min?{percentile25:e.overall.p25Min}:{},...e.overall.p75Max?{percentile75:e.overall.p75Max}:{}}),...ce(e.bySeniority,e.currency,e.name,t)]):null}function kt(e,t){return t?.occupationUrl?H(e.byCategory.map(o=>({name:o.categoryName,url:t.occupationUrl(o)}))):null}function xt(e,t){return e.overallSalary?G("Occupation",e.categoryName,{occupationalCategory:e.categoryName,hiringOrganization:{"@type":"Organization",name:e.companyName}},[x(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardCategoryP25Min?{percentile25:e.boardCategoryP25Min}:{},...e.boardCategoryP75Max?{percentile75:e.boardCategoryP75Max}:{}}),...ce(e.bySeniority,e.currency,e.categoryName,t)]):null}function wt(e,t){return e.company?.name??t.legalName??t.contact?.legalName??t.name??null}var Ut={high_school:"high school",associate_degree:"associate degree",bachelor_degree:"bachelor degree",professional_certificate:"professional certificate",postgraduate_degree:"postgraduate degree"},Lo={full_time:"FULL_TIME",part_time:"PART_TIME",contract:"CONTRACTOR",internship:"INTERN",temporary:"TEMPORARY",volunteer:"VOLUNTEER",other:"OTHER"},To={per_year:"YEAR",per_month:"MONTH",per_week:"WEEK",per_day:"DAY",per_hour:"HOUR"},ue=["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","IO","VG","BN","BG","BF","BI","KH","CM","CA","CV","BQ","KY","CF","TD","CL","CN","CX","CC","CO","KM","CK","CR","HR","CU","CW","CY","CZ","DK","DJ","DM","DO","CD","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","CI","JM","JP","JE","JO","KZ","KE","KI","XK","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","CG","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","KR","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","VI","UY","UZ","VU","VA","VE","VN","WF","EH","YE","ZM","ZW"];function Jt({job:e,board:t,shareUrl:o}){let n=wo(e),r=Jo(e),i=pe({"@context":"https://schema.org/","@type":"JobPosting",title:e.title,description:e.description??"",identifier:Fo(e,t),datePosted:Mt(e.publishedAt),validThrough:Mt(e.expiresAt),employmentType:e.employmentType?Lo[e.employmentType]??"OTHER":"OTHER",hiringOrganization:Io(e,t),jobLocation:xo(e),jobLocationType:e.remoteOption==="remote"?"TELECOMMUTE":void 0,applicantLocationRequirements:e.remoteOption==="remote"?Mo(e):null,baseSalary:ko(e),educationRequirements:n,experienceRequirements:r,experienceInPlaceOfEducation:e.experienceInPlaceOfEducation===!0&&n&&r?!0:void 0,url:o});return!i||Array.isArray(i)||Object.keys(i).length===0?null:i}function Fo(e,t){let o=wt(e,t),n={"@type":"PropertyValue",value:e.id};return o&&(n.name=o),n}function Io(e,t){let o=wt(e,t);if(!o)return null;let n={"@type":"Organization",name:o},r=e.company?.website??null,i=r?U(r):null;i&&(n.sameAs=i);let s=e.company?.logoUrl??t.logoUrl??null;return s&&(n.logo=s),n}function U(e){let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ko(e){let t=e.salaryCurrency?.trim(),o=typeof e.salaryMin=="number",n=typeof e.salaryMax=="number";if(!t||!o&&!n)return null;let r={"@type":"QuantitativeValue"};o&&(r.minValue=e.salaryMin),n&&(r.maxValue=e.salaryMax);let i=e.salaryTimeframe?To[e.salaryTimeframe]:void 0;return i&&(r.unitText=i),!o&&n&&typeof e.salaryMax=="number"?(r.value=e.salaryMax,r.minValue=e.salaryMax):!n&&o&&typeof e.salaryMin=="number"&&(r.value=e.salaryMin,r.maxValue=e.salaryMin),{"@type":"MonetaryAmount",currency:t.toUpperCase(),value:r}}function xo(e){let t=e.officeLocations.map(o=>Uo({countryCode:o.countryCode,region:o.region,locality:o.city??o.locality,postalCode:o.postalCode,name:o.displayName})).filter(o=>o!==null);return t.length===0?null:t.length===1?t[0]:t}function Uo({countryCode:e,region:t,locality:o,postalCode:n,name:r}){let i={"@type":"PostalAddress"},s=e?.trim(),a=t?.trim(),l=o?.trim(),c=n?.trim(),p=r?.trim();s&&(i.addressCountry=s.toUpperCase()),a&&(i.addressRegion=a),l&&(i.addressLocality=l),c&&(i.postalCode=c);let m=Object.keys(i).length>1;if(!m&&!p)return null;let d={"@type":"Place"};return p&&(d.name=p),m&&(d.address=i),d}function Mo(e){if(e.remoteWorldwide)return ue.map(n=>({"@type":"Country",name:n}));let t=[],o=new Set;for(let n of e.remoteWorkPermitCountryCodes??[]){let r=n?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}for(let n of e.remoteWorkPermitSubdivisionCodes??[]){let r=n?.split("-")[0]?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}return t.length===0?null:t.length===1?t[0]:t}function wo(e){let t=e.educationRequirements;if(!t||t.length===0)return null;if(t.includes("no_requirements"))return"no requirements";let o=t.filter(n=>n in Ut).map(n=>({"@type":"EducationalOccupationalCredential",credentialCategory:Ut[n]}));return o.length>0?o:null}function Jo(e){let t=e.experienceMonths;return typeof t!="number"?null:t===0?"no requirements":{"@type":"OccupationalExperienceRequirements",monthsOfExperience:t}}function Mt(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function pe(e){let t=o=>o==null?!1:Array.isArray(o)?o.length>0:typeof o=="object"?Object.keys(o).length>0:!0;if(Array.isArray(e))return e.map(o=>pe(o)).filter(t);if(e&&typeof e=="object"){let o=Object.entries(e).map(([n,r])=>[n,pe(r)]).filter(([,n])=>t(n));return Object.fromEntries(o)}return e}var de={};A(de,{BOARD_PATHS:()=>Y,blogAuthorPath:()=>qo,blogPostPath:()=>Qt,blogTagPath:()=>qt,boardUrl:()=>z,companyMarketPath:()=>jt,companyPath:()=>Dt,companySalaryPath:()=>$o,encodePathSegment:()=>h,goAlertsConfirmPath:()=>Ko,goAlertsManagePath:()=>Vo,goJobPath:()=>Ho,jobDetailPath:()=>me,jobsCategoryPath:()=>V,jobsLocationCategoryPath:()=>K,jobsLocationPath:()=>M,jobsLocationSkillPath:()=>$t,jobsSkillPath:()=>Nt,salaryLocationPath:()=>Qo,salarySkillPath:()=>jo,salaryTitlePath:()=>Do,suggestionPath:()=>No,talentProfilePath:()=>Go});function h(e){try{return encodeURIComponent(decodeURIComponent(e)).replace(/%3A/gi,":")}catch{return encodeURIComponent(e).replace(/%3A/gi,":")}}function me(e,t){return`/companies/${h(e)}/jobs/${h(t)}`}function V(e){return`/jobs/${h(e)}`}function Nt(e){return`/jobs/skills/${h(e)}`}function M(e){return`/jobs/locations/${h(e)}`}function K(e,t){return`${M(e)}/${h(t)}`}function $t(e,t){return`${M(e)}/skills/${h(t)}`}function Dt(e){return`/companies/${h(e)}`}function jt(e){return`/companies/markets/${h(e)}`}function No(e,t){let o=t.location?.trim()||void 0;return t.scope==="blog"?e.type==="post"?Qt(e.slug):e.type==="tag"?qt(e.slug):null:t.scope==="jobs"?e.type==="company"||e.type==="market"||e.type==="post"||e.type==="tag"?null:e.termType==="skill"?o?$t(o,e.canonicalSlug):Nt(e.canonicalSlug):o?K(o,e.canonicalSlug):V(e.canonicalSlug):e.type==="company"?Dt(e.slug):e.type==="market"?jt(e.slug):null}function $o(e){return`/companies/${h(e)}/salaries`}function Do(e){return`/salaries/titles/${h(e)}`}function jo(e){return`/salaries/skills/${h(e)}`}function Qo(e){return`/salaries/locations/${h(e)}`}function Qt(e){return`/blog/${h(e)}`}function qt(e){return`/blog/tag/${h(e)}`}function qo(e){return`/blog/author/${h(e)}`}function Go(e){return`/p/${h(e)}`}var Y={home:"/",jobs:"/jobs",companies:"/companies",salaries:"/salaries",salaryCompanies:"/salaries/companies",salaryTitles:"/salaries/titles",salarySkills:"/salaries/skills",salaryLocations:"/salaries/locations",blog:"/blog",about:"/about",privacyPolicy:"/privacy-policy",termsOfService:"/terms-of-service",cookiePolicy:"/cookie-policy",impressum:"/impressum",talent:"/talent",employers:"/employers",alertsManage:"/alerts/manage",alertsConfirm:"/alerts/confirm"};function Ho(e){return`/go/job/${e}`}function Vo(){return"/go/alerts-manage"}function Ko(){return"/go/alerts-confirm"}function z(e,t){return`${e.replace(/\/+$/,"")}${t}`}function Gt(e,t={}){let o=e.map(r=>{let i=r.label?.trim();return i?{name:i,href:r.href?.trim()??null}:null}).filter(r=>!!r);return o.length<2?null:{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:o.map((r,i)=>{let s=r.href?Yo(r.href,t.origin??null):null,a={"@type":"ListItem",position:i+1,name:r.name};return s&&(a.item=s),a})}}function Yo(e,t){if(zo(e))return e;if(!t)return null;let o=e.startsWith("/")?e:`/${e}`;return`${t}${o}`}function zo(e){return/^https?:\/\//i.test(e)}function W(e){let t=[{kind:"home",path:Y.home},{kind:"jobs",path:Y.jobs}],o=null;for(let r of e.placeHierarchy)o=r.slug,t.push({kind:"place",name:r.name,path:M(r.slug)});let n=e.categories[0];return n&&t.push({kind:"category",name:n.name,path:o?K(o,n.slug):V(n.slug)}),t.push({kind:"job",name:e.title}),t}var Z=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW"];function Wo(e){try{return new Intl.DisplayNames([e],{type:"region"})}catch{return null}}function Zo(e){try{return new Intl.Collator(e)}catch{return new Intl.Collator}}function Ht(e){let t=C(e);if(!t)return Z.map(r=>({code:r,name:r})).sort((r,i)=>r.code<i.code?-1:r.code>i.code?1:0);let o=Wo(t),n=Zo(t).compare;return Z.map(r=>({code:r,name:o?.of(r)??r})).sort((r,i)=>n(r.name,i.name))}function Xo(e,t){if(!Array.isArray(t)||t.length===0)return null;let o=t.map(n=>e.options?.find(r=>r.key===n)?.label).filter(n=>!!n);return o.length>0?o:null}function en(e,t){switch(e.type){case"number":return null;case"multi_select":return null;case"single_select":return typeof t!="string"?null:e.options?.find(o=>o.key===t)?.label??null;default:return typeof t=="string"&&t.trim()!==""?t:null}}function Vt(e,t,o){let n=[];for(let r of t??[]){let i=o?.[r.key];if(r.type==="boolean"){typeof i=="boolean"&&n.push({key:r.key,label:r.label,kind:"boolean",value:i});continue}if(r.type==="number"){typeof i=="number"&&Number.isFinite(i)&&n.push({key:r.key,label:r.label,kind:"number",value:i});continue}if(r.type==="multi_select"){let a=Xo(r,i);a&&n.push({key:r.key,label:r.label,kind:"multi_select",values:a});continue}let s=en(r,i);s!==null&&n.push({key:r.key,label:r.label,kind:"text",value:s})}return n}var fe={};A(fe,{ALL_COUNTRY_CODES:()=>ue,SENIORITY_ORDER:()=>Q,buildJobBreadcrumbs:()=>W,buildSalaryFaq:()=>Et,companyCategorySalaryJsonLd:()=>xt,companySalaryJsonLd:()=>kt,createAuthorProfileJsonLd:()=>Yt,createBlogArticleJsonLd:()=>Kt,createBreadcrumbJsonLd:()=>Gt,createJobPostingJsonLd:()=>Jt,crossAxisSalaryJsonLd:()=>It,faqJsonLd:()=>At,formatSalaryStat:()=>q,formatSalaryStatRange:()=>k,itemListJsonLd:()=>H,listingHead:()=>zt,listingJsonLd:()=>Wt,locationSalaryJsonLd:()=>Ft,normalizeWebsiteUrl:()=>U,skillSalaryJsonLd:()=>Tt,sortBySeniority:()=>vt,titleSalaryJsonLd:()=>Lt});function Kt({post:e,boardName:t,permalink:o,ogImageUrl:n}){let r={"@context":"https://schema.org","@type":"Article",headline:e.title,url:o,mainEntityOfPage:{"@type":"WebPage","@id":o},publisher:{"@type":"Organization",name:t}};e.customExcerpt&&(r.description=e.customExcerpt),e.publishedAt&&(r.datePublished=e.publishedAt);let i=e.coverUrl??n;i&&(r.image=i);let s=e.authors[0];return s&&(r.author={"@type":"Person",name:s.name,...s.websiteUrl?{url:s.websiteUrl}:{}}),r}function Yt({author:e,canonical:t,description:o,origin:n,posts:r,totalPosts:i}){if(!e.name)return null;let s=o.trim(),a=[X(e.websiteUrl),X(e.twitterUrl),X(e.linkedinUrl),X(e.githubUrl)].filter(d=>!!d),l=`${t}#profile`,c=r.slice(0,5).map(d=>{let y=tn(n,`/blog/${d.slug}`);return y?{"@type":"Article",headline:d.title,url:y,datePublished:d.publishedAt,author:{"@id":l}}:null}).filter(d=>d!==null),p=i>0?{"@type":"InteractionCounter",interactionType:"https://schema.org/WriteAction",userInteractionCount:i}:void 0,m={"@context":"https://schema.org","@type":"ProfilePage",url:t,mainEntity:{"@type":"Person","@id":l,name:e.name,alternateName:e.slug??void 0,identifier:e.id??void 0,description:s||void 0,image:e.avatarUrl??void 0,sameAs:a.length>0?a:void 0,url:t,mainEntityOfPage:t,agentInteractionStatistic:p}};return c.length>0&&(m.hasPart=c),m}function X(e){if(!e)return null;let t=e.trim();if(!t)return null;try{let o=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;return new URL(o).toString()}catch{return null}}function tn(e,t){if(!e||!t)return null;try{return new URL(t,e).toString()}catch{return null}}function zt(e){let t=e.title,o=e.description,n=`${e.origin}${e.path}`;return{meta:[{title:t},{name:"description",content:o},{property:"og:title",content:t},{property:"og:description",content:o},{property:"og:type",content:"website"},{property:"og:url",content:n}],links:[{rel:"canonical",href:n}]}}function Wt(e){let t=[];e.breadcrumbs.length>=2&&t.push({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.breadcrumbs.map((n,r)=>({"@type":"ListItem",position:r+1,name:n.name,...n.path?{item:z(e.origin,n.path)}:{}}))});let o=(e.jobs??[]).filter(n=>n.company!=null&&!!n.company.slug);return o.length>0&&t.push({"@context":"https://schema.org","@type":"ItemList",itemListElement:o.map((n,r)=>({"@type":"ListItem",position:r+1,url:z(e.origin,me(n.company.slug,n.slug))}))}),t}var ge={};A(ge,{createSuggestController:()=>rn});function on(e){return typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError"}function nn(e){try{let t=0;for(let o of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e))t+=1;return t}catch{return[...e].length}}function Zt(e,t){return t.size===0?e.slice():e.filter(o=>!(o.type==="company"&&t.has(o.slug.toLowerCase().normalize("NFC"))))}function rn(e,t){let o=t?.minChars??2,n=t?.debounceMs??250,r=t?.limit,i=!1,s={query:"",items:[],status:"idle",error:null},a=[],l=new Set,c=0,p=null,m=null,d=new Set;function y(){for(let u of d)u()}function f(u){s=u,y()}function O(){p!==null&&(globalThis.clearTimeout(p),p=null)}function g(){m&&(m.abort(),m=null)}function R(u){let b=++c;g();let _=new AbortController;m=_;let E={q:u};r!==void 0&&(E.limit=r),e.search.suggest(E,{signal:_.signal}).then(B=>{i||b!==c||(m=null,a=B.items,f({query:s.query,items:Zt(a,l),status:"ready",error:null}))}).catch(B=>{i||b!==c||on(B)||(m=null,f({query:s.query,items:s.items,status:"error",error:B}))})}return{setQuery(u){if(i)return;let b=u.trim();if(O(),nn(b)<o){c+=1,g(),a=[],f({query:u,items:[],status:"idle",error:null});return}c+=1,g(),f({query:u,items:s.items,status:"loading",error:null}),p=globalThis.setTimeout(()=>{p=null,!i&&R(b)},n)},setExcludedCompanySlugs(u){i||(l=new Set(u.map(b=>b.trim().toLowerCase().normalize("NFC")).filter(Boolean)),f({query:s.query,items:Zt(a,l),status:s.status,error:s.error}))},getState(){return s},subscribe(u){return i?()=>{}:(d.add(u),()=>{d.delete(u)})},dispose(){i||(i=!0,O(),g(),c+=1,d.clear())}}}return ro(sn);})();
|
|
1
|
+
"use strict";var CavunoBoard=(()=>{var w=Object.defineProperty;var Xt=Object.getOwnPropertyDescriptor;var eo=Object.getOwnPropertyNames;var to=Object.prototype.hasOwnProperty;var oo=(e,t,o)=>t in e?w(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var A=(e,t)=>{for(var o in t)w(e,o,{get:t[o],enumerable:!0})},no=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of eo(t))!to.call(e,r)&&r!==o&&w(e,r,{get:()=>t[r],enumerable:!(n=Xt(t,r))||n.enumerable});return e};var ro=e=>no(w({},"__esModule",{value:!0}),e);var P=(e,t,o)=>oo(e,typeof t!="symbol"?t+"":t,o);var sn={};A(sn,{ACCESS_TOKEN_KEY:()=>L,BOARD_ACCESS_GRANT_KEY:()=>F,BOARD_API_ERROR_CODES:()=>he,BoardApiError:()=>v,BoardClient:()=>I,REFRESH_TOKEN_KEY:()=>T,SDK_VERSION:()=>$,SIGN_IN_REDIRECT_ERROR_CODES:()=>ke,SSO_LINK_PROOF_BINDING_TTL_MS:()=>oe,createBoardClient:()=>ho,filters:()=>ie,format:()=>ye,isBoardApiError:()=>S,isBoardPasswordRequired:()=>Ce,isColdRule:()=>rt,isConflict:()=>Re,isForbidden:()=>Oe,isFreeEmailWebsiteError:()=>Be,isNotFound:()=>be,isOwnMessage:()=>nt,isRateLimited:()=>Pe,isSafeApplicationUrl:()=>ne,isSignInMethodUnavailable:()=>te,isSsoBrowserMismatch:()=>Ee,isSsoRequired:()=>ve,isUnauthorized:()=>Se,isValidationError:()=>_e,lastOwnMessageId:()=>it,paginate:()=>ot,parseOAuthCompletion:()=>xe,paths:()=>de,resolveApplyAction:()=>st,resolveApplyDecision:()=>re,seo:()=>fe,ssoLinkProofBindingStore:()=>D,suggest:()=>ge});var he=["internal_error","validation_bad_request","validation_payload_too_large","rate_limited","rate_limit_unavailable","search_unavailable","search_filter_unavailable","too_many_filter_values","pagination_invalid_cursor","pagination_offset_too_large","auth_unauthenticated","auth_forbidden","plan_upgrade_required","unknown_error","boards_not_found","board_page_not_found","board_auth_account_not_found","board_auth_email_taken","board_auth_invalid_credentials","board_auth_invalid_token","board_auth_registration_disabled","board_auth_token_expired","board_development_origin_not_allowed_for_email","board_development_origin_not_registered","board_development_origin_requires_publishable_key","sso_required","board_auth_method_unavailable","board_auth_sso_connection_not_found","board_auth_sso_role_unavailable","board_auth_sso_provider_unavailable","board_auth_sso_browser_mismatch","board_auth_sso_not_provisioned","board_auth_sso_identity_linked_elsewhere","invalid_current_password","no_password","same_email","email_taken","invalid_token","board_password_required","board_password_invalid","jobs_not_found","jobs_invalid_filter","categories_not_found","skills_not_found","places_not_found","locations_invalid_id","locations_unavailable","companies_not_found","company_markets_not_found","company_salary_not_found","company_category_salary_not_found","salaries_title_not_found","salaries_skill_not_found","salaries_location_not_found","salaries_title_location_not_found","salaries_skill_location_not_found","blog_post_not_found","blog_author_not_found","blog_tag_not_found","feeds_not_found","feed_not_ready","talent_not_found","talent_directory_not_found","talent_directory_restricted","job_recommendations_not_found","recommended_talent_not_found","job_alert_not_found","job_alerts_disabled","candidate_alert_limit_reached","candidate_alert_not_found","candidate_entry_not_found","candidate_handle_taken","candidate_job_not_found","candidate_notification_preference_paused","candidate_profile_required","resume_invalid_file","resume_upload_forbidden","applications_external_apply_only","applications_country_not_allowed","applications_guest_not_allowed","applications_job_not_found","applications_not_found","applications_resume_invalid_file","applications_unprocessable","messaging_application_not_found","messaging_application_not_linked","messaging_blocked","messaging_cannot_block_self","messaging_cold_rule","messaging_conversation_not_found","messaging_disabled","messaging_edit_window_expired","messaging_message_deleted","messaging_message_not_found","messaging_not_author","messaging_not_participant","messaging_not_permitted","messaging_not_recipient","messaging_rate_limited","messaging_recipient_not_found","messaging_recipient_not_open","messaging_unsend_window_expired","employer_applicant_not_found","employer_ats_unprocessable","employer_checkout_failed","employer_company_exists","employer_free_email_website","employer_company_name_taken","employer_company_not_found","employer_job_not_found","employer_job_slug_taken","employer_jobs_quota_exceeded","membership_required","employer_not_member","employer_payment_required","employer_pipeline_stage_not_found","employer_member_not_found","employer_invite_not_found","not_company_admin","not_company_member","company_deletion_disabled","last_admin","already_member","already_invited","invalid_email","invite_email_mismatch","candidate_role","job_not_published","talent_list_not_found","sourced_candidate_not_found","sourced_convert_unavailable","candidate_paywall_access_required","paywall_already_active","paywall_disabled","paywall_invalid_checkout_session","paywall_no_candidate_profile","paywall_no_recurring_subscription","paywall_offer_not_found","talent_access_unavailable","company_required","already_on_plan","talent_access_required","messaging_talent_access_required","stripe_not_connected","membership_plan_not_found","membership_seat_taken","job_posting_logo_lookup_unavailable","job_posting_logo_not_found","job_posting_rejected"],v=class extends Error{constructor(o){super(o.message);P(this,"status");P(this,"code");P(this,"details");P(this,"requestId");P(this,"raw");this.name="BoardApiError",this.status=o.status,this.code=o.code,this.details=o.details,this.requestId=o.requestId,this.raw=o.raw}};function S(e){return e instanceof Error&&e.name==="BoardApiError"&&typeof e.status=="number"&&typeof e.code=="string"}function be(e){return S(e)&&e.status===404}function Se(e){return S(e)&&e.status===401}function Ce(e){return S(e)&&e.status===401&&e.code==="board_password_required"}function Oe(e){return S(e)&&e.status===403}function _e(e){return S(e)&&e.status===400&&e.code==="validation_bad_request"}function Pe(e){return S(e)&&e.status===429}function Re(e){return S(e)&&e.status===409}function Be(e){return S(e)&&e.status===422&&e.code==="employer_free_email_website"}function ve(e){if(!S(e)||e.status!==403)return!1;let t=e.details?.connectionIds;return Array.isArray(t)&&t.every(o=>typeof o=="string")&&(e.code==="sso_required"||te(e)&&e.details.availableMethods.methods.length===0)}function te(e){if(!S(e)||e.status!==403||e.code!=="board_auth_method_unavailable")return!1;let t=e.details?.availableMethods;if(!t||typeof t!="object")return!1;let{methods:o,ssoConnectionIds:n}=t;return Array.isArray(o)&&o.every(r=>typeof r=="string")&&Array.isArray(n)&&n.every(r=>typeof r=="string")}function Ee(e){return S(e)&&e.status===403&&e.code==="board_auth_sso_browser_mismatch"}function Ae(e){let t=new URLSearchParams;if(!e)return t;for(let[o,n]of Object.entries(e))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&t.append(o,String(r));else t.append(o,String(n));return t}function J(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t+e.charCodeAt(n)>>>0;return`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}-${t.toString(36)}`}var L="cavuno_board_access_token",T="cavuno_board_refresh_token",F="cavuno_board_access_grant";function Le(){return typeof globalThis.document<"u"}function io(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,o)=>{e.set(t,o)},removeItem:t=>{e.delete(t)}}}function so(e,t){if(!Le())throw new Error(`storage mode '${e}' is browser-only \u2014 use 'nostore' + per-call headers on the server`);let o;try{if(o=e==="local"?globalThis.localStorage:globalThis.sessionStorage,!o)throw new Error("unavailable")}catch{throw new Error(`storage mode '${e}' is unavailable in this browsing context (storage access is blocked \u2014 e.g. a sandboxed or third-party iframe). Use 'memory', or 'nostore' + per-call headers.`)}let n=t?`:${J(t)}`:"";return{getItem:r=>o.getItem(`${r}${n}`),setItem:(r,i)=>{o.setItem(`${r}${n}`,i)},removeItem:r=>{o.removeItem(`${r}${n}`)}}}var ao=Symbol.for("@cavuno/board:nostore");var lo={[ao]:!0,getItem:()=>null,setItem:()=>{},removeItem:()=>{}};function Te(e,t){let o=e??(Le()?"memory":"nostore");if(typeof o=="object")return o;switch(o){case"memory":return io();case"nostore":return lo;case"local":case"session":return so(o,t);default:throw new Error(`Unknown storage mode '${String(o)}'`)}}async function N(e,t){await e.setItem(L,t.accessToken),await e.setItem(T,t.refreshToken)}async function Fe(e){await e.removeItem(L),await e.removeItem(T)}var $="4.31.1";function co(e){return typeof e=="string"||e instanceof URLSearchParams||typeof FormData<"u"&&e instanceof FormData||typeof Blob<"u"&&e instanceof Blob||e instanceof ArrayBuffer||typeof ReadableStream<"u"&&e instanceof ReadableStream}function po(e){try{let t=new URL(e);for(let o of new Set(t.searchParams.keys()))t.searchParams.delete(o),t.searchParams.set(o,"[REDACTED]");return t.toString()}catch{return e.replace(/([?&][^=&#]+)=([^&#]*)/g,"$1=[REDACTED]")}}var I=class{constructor(t){P(this,"storage");P(this,"basePath");P(this,"options");this.options=t,this.storage=t.storage;let o=t.baseUrl.replace(/\/+$/,"");this.basePath=`${o}/v1/boards/${encodeURIComponent(t.board)}`}async fetch(t,o={}){let{body:n,query:r,headers:i,...s}=o,a=(o.method??"GET").toUpperCase(),l=`${this.basePath}${t}`,p=Ae(r).toString();p&&(l+=`?${p}`);let m=n!==void 0&&!co(n),d=n===void 0?void 0:m?JSON.stringify(n):n,y=new Headers({accept:"application/json"});m&&y.set("content-type","application/json");for(let[B,ee]of Object.entries(this.options.globalHeaders??{}))y.set(B,ee);let f=await this.storage.getItem(L);f!==null&&y.set("authorization",`Bearer ${f}`);let O=await this.storage.getItem(F);O!==null&&y.set("x-board-access",O),i&&new Headers(i).forEach((B,ee)=>{y.set(ee,B)}),(a!=="GET"||y.has("authorization")||y.has("x-board-access"))&&!y.has("x-cavuno-sdk")&&y.set("x-cavuno-sdk",`board@${$}`);let g={url:l,init:{...s,method:a,headers:y,body:d}};this.options.onRequest&&(g=await this.options.onRequest(g));let R=po(g.url);this.options.logger?.debug(`${a} ${R}`);let u=await globalThis.fetch(g.url,g.init);if(this.options.logger?.debug(`${u.status} ${a} ${R}`),this.options.onResponse&&await this.options.onResponse(u.clone(),g),u.status===204)return;if(u.ok)return await u.json();let b;try{b=await u.json()}catch{b=void 0}let _=b?.error,E=_&&typeof _.code=="string"&&typeof _.message=="string"?new v({status:u.status,code:_.code,message:_.message,details:_.details,requestId:_.requestId,raw:b}):new v({status:u.status,code:"unknown_error",message:u.statusText||"Request failed",raw:b});throw this.options.logger?.error(`${E.status} ${E.code} ${a} ${R}`),E}};var Ie="https://api.cavuno.com";var ke=["oauth_cancelled","oauth_failed","oauth_email_unverified","role_disabled","method_unavailable","sso_required","sso_state_invalid","sso_cancelled","sso_failed","sso_connection_unavailable","sso_not_provisioned","sso_email_required","sso_account_disabled","sso_identity_linked_elsewhere","sso_link_proof_rate_limited","sso_development_origin_not_allowed_for_email"];function uo(e){if(e instanceof URLSearchParams)return e;if(typeof e=="string"){let o=e.includes("?")?e.slice(e.indexOf("?")):e;return new URLSearchParams(o)}let t=new URLSearchParams;for(let[o,n]of Object.entries(e))n!==void 0&&t.set(o,n);return t}function mo(e){return!e||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\")||e.includes("://")||/[\u0000-\u001F\u007F]/.test(e)?"/":e}function yo(e){return e==="candidate"||e==="employer"?e:null}function xe(e){let t=uo(e),o=c=>{let p=t.get(c);return p&&p.length>0?p:null},n=mo(o("returnTo")),r=yo(o("role")),i=o("error");if(i)return{kind:"error",error:i,returnTo:n};let s=o("linkProof");if(s)return{kind:"link_proof",linkProof:s,role:r,returnTo:n};let a=o("linkProofBinding");if(o("status")==="sso_link_proof_sent"&&a)return{kind:"link_proof_sent",linkProofBinding:a,role:r,returnTo:n};let l=o("token");return l?{kind:"token",token:l,method:o("method"),role:r,returnTo:n,isNewUser:o("isNew")==="1"}:{kind:"invalid",returnTo:n}}var oe=1500*1e3,fo="cavuno_board_sso_link_proof_binding";function go(){try{return globalThis.localStorage??null}catch{return null}}function D(e,t={}){let o=`${fo}:${J(e)}`,n=t.now??Date.now,r=()=>t.storage??go(),i=()=>{try{r()?.removeItem(o)}catch{}};return{begin(){let s=globalThis.crypto.getRandomValues(new Uint8Array(32)),a=Array.from(s,c=>c.toString(16).padStart(2,"0")).join(""),l=r();if(!l)throw new Error("SSO requires browser storage or an explicit browser proof");return l.setItem(o,JSON.stringify({binding:a,expiresAt:n()+oe})),a},save(s){},read(){let s=null;try{s=r()?.getItem(o)??null}catch{return null}if(!s)return null;try{let a=JSON.parse(s);if(typeof a.binding=="string"&&typeof a.expiresAt=="number"&&a.expiresAt>n())return a.binding}catch{}return i(),null},clear:i}}function Ue(e,t=""){let o=()=>D(t);async function n(i){return await N(e.storage,i),i}async function r(i){if(i?.refreshToken)return i.refreshToken;let s=await e.storage.getItem(T);if(s===null)throw new Error("No refresh token available \u2014 pass { refreshToken } or configure auth.storage");return s}return{async register(i,s){let a=await e.fetch("/auth/register",{...s,method:"POST",body:i});return n(a)},async login(i,s){let a=await e.fetch("/auth/login",{...s,method:"POST",body:i});return n(a)},async refresh(i,s){let a=await r(i),l=await e.fetch("/auth/refresh",{...s,method:"POST",body:{refreshToken:a}});return n(l)},async logout(i,s){let a=await r(i);await e.fetch("/auth/logout",{...s,method:"POST",body:{refreshToken:a}}),await Fe(e.storage)},verifyEmail(i,s){return e.fetch("/auth/verify-email",{...s,method:"POST",body:i})},verifyWorkEmail(i,s){return e.fetch("/auth/verify-work-email",{...s,method:"POST",body:i})},verifyEmailWithCode(i,s){return e.fetch("/auth/verify-email/otp",{...s,method:"POST",body:i})},resendVerification(i){return e.fetch("/auth/verify-email/resend",{...i,method:"POST"})},forgotPassword(i,s){return e.fetch("/auth/forgot-password",{...s,method:"POST",body:i})},resetPassword(i,s){return e.fetch("/auth/reset-password",{...s,method:"POST",body:i})},requestMagicLink(i,s){return e.fetch("/auth/magic-link",{...s,method:"POST",body:i})},async consumeMagicLink(i,s){let a=await e.fetch("/auth/magic-link/consume",{...s,method:"POST",body:i});return n(a)},getOAuthAuthorizationUrl(i,s,a){return e.fetch(`/auth/oauth/${i}`,{...a,method:"GET",query:s})},async exchangeOAuth(i,s){let a=await e.fetch("/auth/oauth/exchange",{...s,method:"POST",body:{...i,browserBinding:i.browserBinding??o().read()??void 0}});return n(a)},async getSsoAuthorizationUrl(i,s,a){let l=s?.browserBindingHash;if(!l){let c=o().begin(),p=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(c));l=Array.from(new Uint8Array(p),m=>m.toString(16).padStart(2,"0")).join("")}return e.fetch(`/auth/sso/${encodeURIComponent(i)}`,{...a,method:"GET",query:{...s,browserBindingHash:l}})},async consumeSsoLinkProof(i,s){let a=await e.fetch("/auth/sso/link-proof",{...s,method:"POST",body:{...i,browserBinding:i.browserBinding??o().read()??void 0}});return n(a)}}}function Me(e){return{posts:{list(t,o){return e.fetch("/blog/posts",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}`,{...n,query:o})},adjacent(t,o){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/adjacent`,o)},similar(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/similar`,{...n,query:o})}},tags:{list(t,o){return e.fetch("/blog/tags",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/tags/${encodeURIComponent(t)}`,{...n,query:o})}},authors:{list(t,o){return e.fetch("/blog/authors",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/authors/${encodeURIComponent(t)}`,{...n,query:o})}},search(t,o,n){return e.fetch("/blog/search",{...n,method:"POST",body:t,query:o})}}}function we(e){let t=Object.assign((n,r)=>e.fetch("/companies/markets",{...r,query:n}),{resolve(n,r){return e.fetch(`/companies/markets/${encodeURIComponent(n)}`,r)}}),o=Object.assign((n,r)=>e.fetch(`/companies/${encodeURIComponent(n)}/salaries`,r),{summary(n,r){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/summary`,r)},category(n,r,i,s){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/${encodeURIComponent(r)}`,{...s,query:i})}});return{list(n,r){return e.fetch("/companies",{...r,query:n})},retrieve(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}`,{...i,query:r})},search(n,r,i){return e.fetch("/companies/search",{...i,method:"POST",body:n,query:r})},listJobs(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/jobs`,{...i,query:r})},similar(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/similar`,{...i,query:r})},markets:t,salaries:o}}function Je(e){return{jobs(t,o){return e.fetch("/embed/jobs",{...o,query:t})}}}function Ne(e){return{subscribe(t,o){return e.fetch("/job-alerts",{...o,method:"POST",body:t})},confirm(t,o){return e.fetch("/job-alerts/confirm",{...o,method:"POST",body:t})},resendConfirmation(t,o){return e.fetch("/job-alerts/resend-confirmation",{...o,method:"POST",body:t})},manage(t,o){return e.fetch("/job-alerts/manage",{...o,query:t})},unsubscribe(t,o){return e.fetch("/job-alerts/unsubscribe",{...o,method:"POST",body:t})},resubscribe(t,o){return e.fetch("/job-alerts/resubscribe",{...o,method:"POST",body:t})},updatePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"POST",body:t})},deletePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"DELETE",body:t})}}}function $e(e){return{plans(t,o){return e.fetch("/job-postings/plans",{...o,query:t})},create(t,o){return e.fetch("/job-postings",{...o,method:"POST",body:t})},uploadLogo(t,o){let n=new FormData;return n.append("file",t),e.fetch("/job-postings/logo",{...o,method:"POST",body:n})},fetchLogoByDomain(t,o){return e.fetch("/job-postings/logo/fetch",{...o,query:{domain:t}})},sendBillingVerification(t,o){return e.fetch("/job-postings/send-verification",{...o,method:"POST",body:t})},getBillingOptions(t,o){return e.fetch("/job-postings/billing-options",{...o,method:"POST",body:t})}}}function De(e){return{collectionChoices(t,o,n){return e.fetch(`/job-fields/${encodeURIComponent(t)}/choices`,{...n,query:o})},list(t,o){return e.fetch("/jobs",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}`,{...n,query:o})},search(t,o,n){return e.fetch("/jobs/search",{...n,method:"POST",body:t,query:o})},similar(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/similar`,{...n,query:o})},apply(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply`,{...n,method:"POST",body:o??{}})},createApplyIntent(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply-intents`,{...n,method:"POST",body:o})},prepareApplyApproval(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply-approvals`,{...n,method:"POST",body:o})},uploadApplicationResume(t,o,n,r){let i=new FormData;return i.append("file",o),n?.applicationId&&i.append("applicationId",n.applicationId),e.fetch(`/jobs/${encodeURIComponent(t)}/apply/resume`,{...r,method:"POST",body:i})},myApplication(t,o){return e.fetch(`/jobs/${encodeURIComponent(t)}/application`,o)}}}function je(e){return{search(t,o){return e.fetch("/locations/search",{...o,query:t})},resolve(t,o){return e.fetch("/locations/resolve",{...o,method:"POST",body:t})}}}function Qe(e){return{retrieve(t,o){return e.fetch("/me",{...o,query:t})},delete(t){return e.fetch("/me",{...t,method:"DELETE"})},async updatePassword(t,o){let n=await e.fetch("/me/password",{...o,method:"POST",body:t});return await N(e.storage,n),n},requestEmailChange(t,o){return e.fetch("/me/email",{...o,method:"POST",body:t})},confirmEmailChange(t,o){return e.fetch("/me/email/confirm",{...o,method:"POST",body:t})},acceptInvite(t,o){return e.fetch("/me/invites/accept",{...o,method:"POST",body:t})},profile:{listObjectReferenceChoices(t,o,n){return e.fetch("/me/profile/object-references/choices",{...n,query:{...o,fieldKey:t}})},retrieve(t,o){return e.fetch("/me/profile",{...o,query:t})},update(t,o,n){return e.fetch("/me/profile",{...n,method:"PATCH",body:t,query:o})},retrieveCustomFields(t){return e.fetch("/me/profile/custom-fields",{...t})},updateCustomFields(t,o){return e.fetch("/me/profile/custom-fields",{...o,method:"PATCH",body:t})},retrieveObjectReferences(t){return e.fetch("/me/profile/object-references",t)},updateObjectReferences(t,o){return e.fetch("/me/profile/object-references",{...o,method:"PUT",body:t})},handleAvailable(t,o){return e.fetch("/me/profile/handle-available",{...o,query:{handle:t}})},listExperience(t){return e.fetch("/me/profile/experience",t)},createExperience(t,o){return e.fetch("/me/profile/experience",{...o,method:"POST",body:t})},updateExperience(t,o,n){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteExperience(t,o){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listEducation(t){return e.fetch("/me/profile/education",t)},createEducation(t,o){return e.fetch("/me/profile/education",{...o,method:"POST",body:t})},updateEducation(t,o,n){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteEducation(t,o){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listSkills(t){return e.fetch("/me/profile/skills",t)},updateSkills(t,o){return e.fetch("/me/profile/skills",{...o,method:"PUT",body:t})},listLanguages(t){return e.fetch("/me/profile/languages",t)},updateLanguages(t,o){return e.fetch("/me/profile/languages",{...o,method:"PUT",body:t})},uploadAvatar(t,o){let n=new FormData;return n.append("file",t),e.fetch("/me/profile/avatar",{...o,method:"POST",body:n})}},notificationPreferences:{retrieve(t){return e.fetch("/me/notification-preferences",t)},update(t,o){return e.fetch("/me/notification-preferences",{...o,method:"PUT",body:t})},unsubscribeWithToken(t,o){return e.fetch("/me/notification-preferences/unsubscribe",{...o,method:"POST",body:t})}},companies:{listObjectReferenceChoices(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references/choices`,{...r,query:{...n,fieldKey:o}})},retrieveObjectReferences(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references`,o)},updateObjectReferences(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/object-references`,{...n,method:"PUT",body:o})},search(t,o){return e.fetch("/me/companies/search",{...o,query:t})},list(t){return e.fetch("/me/companies",t)},create(t,o){return e.fetch("/me/companies",{...o,method:"POST",body:t})},claim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"POST"})},cancelClaim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"DELETE"})},retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},retrieveCustomFields(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/custom-fields`,o)},updateCustomFields(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/custom-fields`,{...n,method:"PATCH",body:o})},delete(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listMembers(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members`,o)},updateMemberRole(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},removeMember(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/members/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},leave(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership`,{...o,method:"DELETE"})},startMembershipCheckout(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership/checkout`,{...n,method:"POST",body:o})},retrieveMembershipCheckout(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/membership/checkout/${encodeURIComponent(o)}`,n)},listInvites(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites`,o)},createInvite(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites`,{...n,method:"POST",body:o})},revokeInvite(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/invites/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},uploadLogo(t,o,n){let r=new FormData;return r.append("file",o),e.fetch(`/me/companies/${encodeURIComponent(t)}/logo`,{...n,method:"POST",body:r})},workEmail:{verify(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/verify`,{...n,method:"POST",body:o})},confirm(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/confirm`,{...n,method:"POST",body:o})}},jobs:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,query:o})},retrieve(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,n)},create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},delete(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},publish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/publish`,{...n,method:"POST"})},unpublish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/unpublish`,{...n,method:"POST"})},checkout(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/checkout`,{...r,method:"POST",body:n})}},billingOptions:{list(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/billing-options`,o)}},billingPortal:{create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/billing-portal`,{...n,method:"POST",body:o})}},jobStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats/timeseries`,{...n,query:o})}},profileStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats/timeseries`,{...n,query:o})}},recommendedTalent:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/recommended-talent`,{...n,query:o})}},talentLists:{list(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists`,o)},create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/talent-lists/${encodeURIComponent(o)}`,{...n,method:"DELETE"})}},sourcedCandidates:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates`,{...n,query:o})},add(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates`,{...n,method:"POST",body:o})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},convert(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/sourced-candidates/${encodeURIComponent(o)}/convert`,{...r,method:"POST",body:n})}},applicants:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants`,{...n,query:o})},move(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/stage`,{...r,method:"PATCH",body:n})},bulkMove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/move`,{...n,method:"POST",body:o})},bulkReject(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/reject`,{...n,method:"POST",body:o})},addNote(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/notes`,{...r,method:"POST",body:n})}},pipelineStages:{create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},reorder(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/reorder`,{...n,method:"PUT",body:o})}}},talentAccess:{retrieve(t){return e.fetch("/me/talent-access",t)},retrieveCandidate(t,o){return e.fetch(`/me/talent-access/candidates/${encodeURIComponent(t)}`,o)},checkout(t,o){return e.fetch("/me/talent-access/checkout",{...o,method:"POST",body:t})},claim(t,o){return e.fetch("/me/talent-access/claim",{...o,method:"POST",body:t})},retrieveCheckout(t,o){return e.fetch(`/me/talent-access/checkout/${encodeURIComponent(t)}`,o)},unlock(t,o){return e.fetch("/me/talent-access/unlocks",{...o,method:"POST",body:t})},upgrade(t,o){return e.fetch("/me/talent-access/upgrade",{...o,method:"POST",body:t})}},alerts:{list(t){return e.fetch("/me/alerts",t)},create(t,o){return e.fetch("/me/alerts",{...o,method:"POST",body:t})},retrieve(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...n,method:"PUT",body:o})},remove(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...o,method:"DELETE"})}},applications:{list(t,o){return e.fetch("/me/applications",{...o,query:t})},retrieve(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,o)},updateFacts(t,o,n){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},withdraw(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}/withdraw`,{...o,method:"POST"})}},resume:{upload(t,o,n){let r=new FormData;return r.append("resume",t),o?.keepResumeOnFile&&r.append("keepResumeOnFile","true"),o?.importMode&&r.append("importMode",o.importMode),o?.confirmReplaceAll&&r.append("confirmReplaceAll","true"),e.fetch("/me/resume",{...n,method:"POST",body:r})},retrieve(t){return e.fetch("/me/resume",t)},delete(t){return e.fetch("/me/resume",{...t,method:"DELETE"})}},recommendedJobs:{list(t,o){return e.fetch("/me/recommended-jobs",{...o,query:t})}},savedJobs:{list(t,o){return e.fetch("/me/saved-jobs",{...o,query:t})},save(t,o,n){return e.fetch("/me/saved-jobs",{...n,method:"POST",body:t,query:o})},unsave(t,o,n){return e.fetch(`/me/saved-jobs/${encodeURIComponent(t)}`,{...n,method:"DELETE",query:o})}},conversations:{list(t,o){return e.fetch("/me/conversations",{...o,query:t})},unreadCount(t){return e.fetch("/me/conversations/unread-count",t)},retrieve(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}`,o)},listMessages(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/messages`,{...n,query:o})},start(t,o){return e.fetch("/me/conversations",{...o,method:"POST",body:t})},startAboutApplication(t,o){return e.fetch("/me/conversations/about-application",{...o,method:"POST",body:t})},reply(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/reply`,{...n,method:"POST",body:o})},markRead(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/read`,{...o,method:"POST"})},archive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/archive`,{...o,method:"POST"})},unarchive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/unarchive`,{...o,method:"POST"})},findExisting(t,o){return e.fetch("/me/conversations/find-existing",{...o,query:t})}},blocks:{list(t){return e.fetch("/me/blocks",t)},create(t,o){return e.fetch("/me/blocks",{...o,method:"POST",body:t})},remove(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},status(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,o)}},messages:{edit(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},unsend(t,o){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},report(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}/report`,{...n,method:"POST",body:o})}},marketingConsent:{retrieve(t){return e.fetch("/me/marketing-consent",t)},grant(t){return e.fetch("/me/marketing-consent/grant",{...t,method:"POST"})},withdraw(t){return e.fetch("/me/marketing-consent/withdraw",{...t,method:"POST"})}},access:{checkout(t,o){return e.fetch("/me/access/checkout",{...o,method:"POST",body:t})},retrieveCheckout(t,o){return e.fetch(`/me/access/checkout/${encodeURIComponent(t)}`,o)},grant(t){return e.fetch("/me/access/grant",t)},portal(t,o){return e.fetch("/me/access/portal",{...o,method:"POST",body:t})}}}}function qe(e){return{async verify(t,o){let n=await e.fetch("/password/verify",{...o,method:"POST",body:{password:t}});return await e.storage.setItem(F,n.token),n}}}function Ge(e){return{offers(t){return e.fetch("/paywall/offers/enabled",t)}}}function He(e){return{list(t,o){return e.fetch("/plans",{...o,query:t})},salesLed(t){return e.fetch("/sales-led-plans",t)}}}function Ve(e){return{retrieve(t,o){return e.fetch(`/profile-fields/${encodeURIComponent(t)}`,o)},choices(t,o,n,r){return e.fetch(`/profile-fields/${encodeURIComponent(t)}/${encodeURIComponent(o)}/choices`,{...r,query:n})}}}function Ke(e){return{resolve(t,o){return e.fetch("/redirects/resolve",{...o,query:{path:t}})}}}function Ye(e){return{companies:{list(t){return e.fetch("/salaries/companies",t)}},titles:{list(t,o){return e.fetch("/salaries/titles",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},skills:{list(t,o){return e.fetch("/salaries/skills",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},locations:{list(t,o){return e.fetch("/salaries/locations",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}`,{...n,query:o})},titles(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/titles`,{...n,query:o})},skills(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/skills`,{...n,query:o})}}}}function ze(e){return{suggest(t,o){return e.fetch("/search/suggest",{...o,query:t})}}}function We(e){return Object.assign(t=>e.fetch("/sitemap",t),{entries(t,o,n){return e.fetch(`/sitemap/${encodeURIComponent(t)}`,{...n,query:o})}})}function Ze(e){return{list(t,o){let n=t?{...t,customFields:t.customFields?JSON.stringify(t.customFields):void 0,objectReferences:t.objectReferences?JSON.stringify(t.objectReferences):void 0}:void 0;return e.fetch("/talent",{...o,query:n})},retrieve(t,o){return e.fetch(`/talent/${encodeURIComponent(t)}`,o)}}}function et(e,t){return{resolve(o,n){return e.fetch(`/${t}/${encodeURIComponent(o)}`,n)}}}function Xe(e,t){return{...et(e,t),list(o,n){return e.fetch(`/${t}`,{...n,query:o})}}}function tt(e){return{categories:Xe(e,"categories"),skills:Xe(e,"skills"),remotePermits:{list(t){return e.fetch("/remote-permits",t)}},places:{...et(e,"places"),list(t,o){return e.fetch("/places",{...o,query:t})}}}}function ot(e,t,o){async function*n(){let r=t;for(;;){let i=await e(r,o);if(yield i,!i.hasMore||i.nextCursor===null)return;let{offset:s,...a}=r??{};r={...a,cursor:i.nextCursor}}}return{pages:n,async*[Symbol.asyncIterator](){for await(let r of n())yield*r.data},async toArray({limit:r}){let i=[];for await(let s of n())if(i.push(...s.data),i.length>=r)break;return i.slice(0,r)}}}function nt(e,t){return e.authorBoardUserId!==t}function rt(e,t){let o=e.some(r=>r.authorBoardUserId===t);return e.some(r=>r.authorBoardUserId!==t)&&!o}function it(e,t){for(let o=e.length-1;o>=0;o--){let n=e[o];if(n.authorBoardUserId!==t)return n.id}return null}function ne(e){let t=e.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,"").replace(/[\t\n\r]/g,""),o=/^([a-z][a-z0-9+.-]*):/i.exec(t)?.[1]?.toLowerCase();return o===void 0?!0:o==="http"||o==="https"||o==="mailto"}function re(e){let t=e.applicationUrl&&ne(e.applicationUrl)?e.applicationUrl:null;return!t&&!e.jobSlug?{kind:"none"}:e.registrationWall&&!e.viewer?{kind:"sign-in",reason:"registration-wall"}:t?{kind:"external",url:t}:e.jobSlug?e.viewer?e.viewer.emailVerified?e.applied?{kind:"applied"}:{kind:"native",jobSlug:e.jobSlug}:{kind:"verify-email"}:e.allowGuestApply?{kind:"guest",jobSlug:e.jobSlug}:{kind:"sign-in",reason:"native-apply"}:{kind:"none"}}function st(e){let t=re({...e,registrationWall:!1,allowGuestApply:!1});return t.kind==="sign-in"?{kind:"sign-in"}:t}function ho(e){let t=new I({baseUrl:e.baseUrl??Ie,board:e.board,storage:Te(e.auth?.storage,e.board),globalHeaders:e.globalHeaders,onRequest:e.onRequest,onResponse:e.onResponse,logger:e.logger});return{client:t,context(o){return t.fetch("",o)},seo(o){return t.fetch("/seo",o)},jobs:De(t),embed:Je(t),companies:we(t),blog:Me(t),auth:Ue(t,e.board),me:Qe(t),password:qe(t),taxonomy:tt(t),search:ze(t),locations:je(t),redirects:Ke(t),jobAlerts:Ne(t),jobPosting:$e(t),salaries:Ye(t),talent:Ze(t),profileFields:Ve(t),plans:He(t),paywall:Ge(t),sitemap:We(t)}}var ie={};A(ie,{DEFAULT_SORT:()=>bo,EMPLOYMENT_TYPES:()=>lt,JOB_SORTS:()=>pt,REMOTE_OPTIONS:()=>at,SENIORITIES:()=>ct,parseCategory:()=>dt,parseCompany:()=>mt,parseListingFilters:()=>Co,parseSeniority:()=>ut});var at=["on_site","hybrid","remote"],lt=["full_time","part_time","contract","internship","temporary"],ct=["entry_level","associate","mid_level","senior","lead","principal","director","executive"],pt=["relevance","newest","salary_high"],bo="relevance";var So=new Set(ct);function ut(e){let t=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],o=[],n=new Set;for(let r of t){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");!i||n.has(i)||So.has(i)&&(n.add(i),o.push(i))}return o.length>0?o:void 0}function mt(e){return yt(e,10)}function dt(e){return yt(e,10)}function yt(e,t){let o=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],n=[],r=new Set;for(let i of o){if(typeof i!="string")continue;let s=i.trim().toLowerCase().normalize("NFC");if(!(!s||r.has(s))&&(r.add(s),n.push(s),n.length>=t))break}return n.length>0?n:void 0}function Co(e){return{q:typeof e.q=="string"&&e.q?e.q:void 0,remoteOption:at.includes(e.remoteOption)?e.remoteOption:void 0,employmentType:lt.includes(e.employmentType)?e.employmentType:void 0,seniority:ut(e.seniority),company:mt(e.company),category:dt(e.category),sort:pt.includes(e.sort)?e.sort:void 0}}var ye={};A(ye,{COUNTRY_CODES:()=>Z,buildJobBreadcrumbs:()=>W,countryOptions:()=>Ht,formatDate:()=>St,formatMonthYear:()=>Ot,formatPublishedRelativeDate:()=>Ct,formatSalaryRange:()=>_t,formatSalaryStat:()=>q,formatSalaryStatRange:()=>k,normalizeWebsiteUrl:()=>U,resolveCustomFieldDisplay:()=>Vt});function C(e){let t=e.trim();if(!t)return null;try{let o=t.replace(/_/g,"-"),[n]=Intl.getCanonicalLocales(o);if(!n)return null;let[r]=Intl.NumberFormat.supportedLocalesOf([n]);return r??null}catch{return null}}var ft=new Map,gt=new Map,ht=new Map,bt=new Map;function Oo(e){let t=ft.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"always",style:"short"}),ft.set(e,t)),t}function _o(e){let t=gt.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"auto",style:"short"}),gt.set(e,t)),t}function Po(e){let t=ht.get(e);return t||(t=new Intl.DateTimeFormat(e,{dateStyle:"medium",timeZone:"UTC"}),ht.set(e,t)),t}function Ro(e){let t=bt.get(e);return t||(t=new Intl.DateTimeFormat(e,{month:"short",year:"numeric",timeZone:"UTC"}),bt.set(e,t)),t}function se(e,t,o){try{return Oo(o).format(e,t)}catch{return null}}function St(e,t){if(!t)return null;let o=new Date(t);if(Number.isNaN(o.getTime()))return null;let n=C(e);if(!n)return null;try{return Po(n).format(o)}catch{return o.toISOString().split("T")[0]}}function Ct(e,t,o=Date.now()){if(!t)return null;let n=new Date(t);if(Number.isNaN(n.getTime()))return null;let r=C(e);if(!r)return null;let i=o-n.getTime(),s=Math.abs(i),a=60*1e3,l=60*a,c=24*l,p=7*c,m=30*c,d=365*c;if(s<a)try{return _o(r).format(0,"second")}catch{return se(0,"second",r)}let y=[{unit:"year",ms:d},{unit:"month",ms:m},{unit:"week",ms:p},{unit:"day",ms:c},{unit:"hour",ms:l},{unit:"minute",ms:a}];for(let g of y)if(s>=g.ms){let R=Math.round(s/g.ms),u=i>=0?-R:R;return se(u,g.unit,r)}let f=Math.round(s/1e3),O=i>=0?-f:f;return se(O,"second",r)}function Ot(e,t){if(!t)return null;let n=/^\d{4}-\d{2}(-\d{2})?$/.test(t)?new Date(t.length===7?`${t}-01T00:00:00.000Z`:`${t}T00:00:00.000Z`):new Date(t);if(Number.isNaN(n.getTime()))return null;let r=C(e);if(!r)return null;try{return Ro(r).format(n)}catch{return null}}var j=new Map;function ae(e,t,o,n="symbol",r="compact"){let i=`${t}:${o}:${n}:${r}`,s=j.get(i);if(s===void 0){try{let a={style:"currency",currency:o,currencyDisplay:n,notation:r};r==="compact"&&(a.compactDisplay="short",a.maximumFractionDigits=1,a.minimumFractionDigits=0),s=new Intl.NumberFormat(t,a)}catch{s=null}j.set(i,s)}return s?s.format(e):null}function le(e,t,o){if(typeof e.formatRange=="function")try{return e.formatRange(t,o)}catch{}try{return`${e.format(t)}\u2013${e.format(o)}`}catch{return null}}function Bo(e,t,o,n,r="symbol",i="compact"){let s=`${o}:${n}:${r}:${i}:range`,a=j.get(s);if(a===void 0){try{let l={style:"currency",currency:n,currencyDisplay:r,notation:i};i==="compact"&&(l.compactDisplay="short",l.maximumFractionDigits=1,l.minimumFractionDigits=0),a=new Intl.NumberFormat(o,l)}catch{a=null}j.set(s,a)}return a?le(a,e,t):null}var vo=new Set(["per_year","per_month","per_week","per_day","per_hour"]);function Eo(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function _t(e,t,o,n,r=null,i="symbol",s){let a=t==null||Number.isFinite(t),l=o==null||Number.isFinite(o);if(!a||!l||t==null&&o==null)return null;let c=r?.trim().toUpperCase()||null;if(!c)return null;let p=C(e);if(!p)return null;let m=s??Eo(t,o),d=typeof n=="string"&&vo.has(n)?n:null;if(t!=null&&o!=null){let f=t<=o?t:o,O=t<=o?o:t,g=f===O?ae(f,p,c,i,m):Bo(f,O,p,c,i,m);return g?{text:g,timeframe:d,bound:"range"}:null}if(t!=null){let f=ae(t,p,c,i,m);return f?{text:f,timeframe:d,bound:"from"}:null}let y=ae(o,p,c,i,m);return y?{text:y,timeframe:d,bound:"upTo"}:null}var Pt=new Map;function Rt(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function Bt(e,t,o){let n=`${e}:${t}:${o}`,r=Pt.get(n);if(r!==void 0)return r;let i;try{let s={style:"currency",currency:t,notation:o};o==="compact"&&(s.compactDisplay="short",s.minimumFractionDigits=0,s.maximumFractionDigits=1),i=new Intl.NumberFormat(e,s)}catch{i=null}return Pt.set(n,i),i}function q(e,t,o,n){if(!Number.isFinite(t))return null;let r=o?.trim().toUpperCase()||null;if(!r)return null;let i=C(e);if(!i)return null;let s=n??Rt(t),a=Bt(i,r,s);return a?a.format(t):null}function k(e,t,o,n,r){if(!Number.isFinite(t)||!Number.isFinite(o))return null;let i=n?.trim().toUpperCase()||null;if(!i)return null;let s=C(e);if(!s)return null;let a=r??Rt(t,o),l=Bt(s,i,a);if(!l)return null;let c=Math.min(t,o),p=Math.max(t,o);return c===p?l.format(c):le(l,c,p)}var Q=["entry_level","associate","mid_level","senior","lead","principal","director","executive"];function vt(e){return[...e].sort((t,o)=>{let n=Q.indexOf(t.seniority),r=Q.indexOf(o.seniority);return(n===-1?999:n)-(r===-1?999:r)})}var Ao={unitText:"YEAR",duration:"P1Y"};function x(e,t,o,n,r={}){return{"@type":"MonetaryAmountDistribution",...e!==void 0?{name:e}:{},currency:t,minValue:o,maxValue:n,...r,...Ao}}function ce(e,t,o,n){return e.map(r=>{let i=n?.seniorityName?.({seniority:r.seniority,entity:o});return x(i,t,r.avgSalaryMin,r.avgSalaryMax)})}function G(e,t,o,n){return{"@context":"https://schema.org","@type":e,name:t,...o,estimatedSalary:n}}function Et(e,t,o,n){if(!o)return[];let r=k(e,o.avgMin,o.avgMax,n);return[{kind:"average",label:t,range:r,avgMin:o.avgMin,avgMax:o.avgMax,currency:n,jobCount:o.jobCount},{kind:"methodology",label:t}]}function H(e){return e.length===0?null:{"@context":"https://schema.org","@type":"ItemList",numberOfItems:e.length,itemListElement:e.map((t,o)=>({"@type":"ListItem",position:o+1,name:t.name,url:t.url}))}}function At(e){return e.length===0?null:{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(t=>({"@type":"Question",name:t.q,acceptedAnswer:{"@type":"Answer",text:t.a}}))}}function Lt(e,t){return e.overallSalary?G("Occupation",e.categoryName,{},[x(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardP25Min?{percentile25:e.boardP25Min}:{},...e.boardP75Max?{percentile75:e.boardP75Max}:{}}),...ce(e.bySeniority,e.currency,e.categoryName,t)]):null}function Tt(e){return e.overallSalary?G("Occupation",e.skillName,{},[x(e.skillName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{median:Math.round((e.overallSalary.medianMin+e.overallSalary.medianMax)/2)})]):null}function Ft(e,t){return!t?.occupationUrl||!(e.adminLevel==="city"||e.adminLevel==="locality")?null:H(e.topCategories.map(n=>({name:n.categoryName,url:t.occupationUrl(n)})))}function It(e,t){return e.overall?G("Occupation",e.name,{occupationLocation:{"@type":"AdministrativeArea",name:e.placeName,address:{"@type":"PostalAddress",addressCountry:e.countryCode}}},[x(e.name,e.currency,e.overall.avgMin,e.overall.avgMax,{...e.overall.p25Min?{percentile25:e.overall.p25Min}:{},...e.overall.p75Max?{percentile75:e.overall.p75Max}:{}}),...ce(e.bySeniority,e.currency,e.name,t)]):null}function kt(e,t){return t?.occupationUrl?H(e.byCategory.map(o=>({name:o.categoryName,url:t.occupationUrl(o)}))):null}function xt(e,t){return e.overallSalary?G("Occupation",e.categoryName,{occupationalCategory:e.categoryName,hiringOrganization:{"@type":"Organization",name:e.companyName}},[x(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardCategoryP25Min?{percentile25:e.boardCategoryP25Min}:{},...e.boardCategoryP75Max?{percentile75:e.boardCategoryP75Max}:{}}),...ce(e.bySeniority,e.currency,e.categoryName,t)]):null}function wt(e,t){return e.company?.name??t.legalName??t.contact?.legalName??t.name??null}var Ut={high_school:"high school",associate_degree:"associate degree",bachelor_degree:"bachelor degree",professional_certificate:"professional certificate",postgraduate_degree:"postgraduate degree"},Lo={full_time:"FULL_TIME",part_time:"PART_TIME",contract:"CONTRACTOR",internship:"INTERN",temporary:"TEMPORARY",volunteer:"VOLUNTEER",other:"OTHER"},To={per_year:"YEAR",per_month:"MONTH",per_week:"WEEK",per_day:"DAY",per_hour:"HOUR"},ue=["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","IO","VG","BN","BG","BF","BI","KH","CM","CA","CV","BQ","KY","CF","TD","CL","CN","CX","CC","CO","KM","CK","CR","HR","CU","CW","CY","CZ","DK","DJ","DM","DO","CD","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","CI","JM","JP","JE","JO","KZ","KE","KI","XK","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","CG","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","KR","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","VI","UY","UZ","VU","VA","VE","VN","WF","EH","YE","ZM","ZW"];function Jt({job:e,board:t,shareUrl:o}){let n=wo(e),r=Jo(e),i=pe({"@context":"https://schema.org/","@type":"JobPosting",title:e.title,description:e.description??"",identifier:Fo(e,t),datePosted:Mt(e.publishedAt),validThrough:Mt(e.expiresAt),employmentType:e.employmentType?Lo[e.employmentType]??"OTHER":"OTHER",hiringOrganization:Io(e,t),jobLocation:xo(e),jobLocationType:e.remoteOption==="remote"?"TELECOMMUTE":void 0,applicantLocationRequirements:e.remoteOption==="remote"?Mo(e):null,baseSalary:ko(e),educationRequirements:n,experienceRequirements:r,experienceInPlaceOfEducation:e.experienceInPlaceOfEducation===!0&&n&&r?!0:void 0,url:o});return!i||Array.isArray(i)||Object.keys(i).length===0?null:i}function Fo(e,t){let o=wt(e,t),n={"@type":"PropertyValue",value:e.id};return o&&(n.name=o),n}function Io(e,t){let o=wt(e,t);if(!o)return null;let n={"@type":"Organization",name:o},r=e.company?.website??null,i=r?U(r):null;i&&(n.sameAs=i);let s=e.company?.logoUrl??t.logoUrl??null;return s&&(n.logo=s),n}function U(e){let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ko(e){let t=e.salaryCurrency?.trim(),o=typeof e.salaryMin=="number",n=typeof e.salaryMax=="number";if(!t||!o&&!n)return null;let r={"@type":"QuantitativeValue"};o&&(r.minValue=e.salaryMin),n&&(r.maxValue=e.salaryMax);let i=e.salaryTimeframe?To[e.salaryTimeframe]:void 0;return i&&(r.unitText=i),!o&&n&&typeof e.salaryMax=="number"?(r.value=e.salaryMax,r.minValue=e.salaryMax):!n&&o&&typeof e.salaryMin=="number"&&(r.value=e.salaryMin,r.maxValue=e.salaryMin),{"@type":"MonetaryAmount",currency:t.toUpperCase(),value:r}}function xo(e){let t=e.officeLocations.map(o=>Uo({countryCode:o.countryCode,region:o.region,locality:o.city??o.locality,postalCode:o.postalCode,name:o.displayName})).filter(o=>o!==null);return t.length===0?null:t.length===1?t[0]:t}function Uo({countryCode:e,region:t,locality:o,postalCode:n,name:r}){let i={"@type":"PostalAddress"},s=e?.trim(),a=t?.trim(),l=o?.trim(),c=n?.trim(),p=r?.trim();s&&(i.addressCountry=s.toUpperCase()),a&&(i.addressRegion=a),l&&(i.addressLocality=l),c&&(i.postalCode=c);let m=Object.keys(i).length>1;if(!m&&!p)return null;let d={"@type":"Place"};return p&&(d.name=p),m&&(d.address=i),d}function Mo(e){if(e.remoteWorldwide)return ue.map(n=>({"@type":"Country",name:n}));let t=[],o=new Set;for(let n of e.remoteWorkPermitCountryCodes??[]){let r=n?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}for(let n of e.remoteWorkPermitSubdivisionCodes??[]){let r=n?.split("-")[0]?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}return t.length===0?null:t.length===1?t[0]:t}function wo(e){let t=e.educationRequirements;if(!t||t.length===0)return null;if(t.includes("no_requirements"))return"no requirements";let o=t.filter(n=>n in Ut).map(n=>({"@type":"EducationalOccupationalCredential",credentialCategory:Ut[n]}));return o.length>0?o:null}function Jo(e){let t=e.experienceMonths;return typeof t!="number"?null:t===0?"no requirements":{"@type":"OccupationalExperienceRequirements",monthsOfExperience:t}}function Mt(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function pe(e){let t=o=>o==null?!1:Array.isArray(o)?o.length>0:typeof o=="object"?Object.keys(o).length>0:!0;if(Array.isArray(e))return e.map(o=>pe(o)).filter(t);if(e&&typeof e=="object"){let o=Object.entries(e).map(([n,r])=>[n,pe(r)]).filter(([,n])=>t(n));return Object.fromEntries(o)}return e}var de={};A(de,{BOARD_PATHS:()=>Y,blogAuthorPath:()=>qo,blogPostPath:()=>Qt,blogTagPath:()=>qt,boardUrl:()=>z,companyMarketPath:()=>jt,companyPath:()=>Dt,companySalaryPath:()=>$o,encodePathSegment:()=>h,goAlertsConfirmPath:()=>Ko,goAlertsManagePath:()=>Vo,goJobPath:()=>Ho,jobDetailPath:()=>me,jobsCategoryPath:()=>V,jobsLocationCategoryPath:()=>K,jobsLocationPath:()=>M,jobsLocationSkillPath:()=>$t,jobsSkillPath:()=>Nt,salaryLocationPath:()=>Qo,salarySkillPath:()=>jo,salaryTitlePath:()=>Do,suggestionPath:()=>No,talentProfilePath:()=>Go});function h(e){try{return encodeURIComponent(decodeURIComponent(e)).replace(/%3A/gi,":")}catch{return encodeURIComponent(e).replace(/%3A/gi,":")}}function me(e,t){return`/companies/${h(e)}/jobs/${h(t)}`}function V(e){return`/jobs/${h(e)}`}function Nt(e){return`/jobs/skills/${h(e)}`}function M(e){return`/jobs/locations/${h(e)}`}function K(e,t){return`${M(e)}/${h(t)}`}function $t(e,t){return`${M(e)}/skills/${h(t)}`}function Dt(e){return`/companies/${h(e)}`}function jt(e){return`/companies/markets/${h(e)}`}function No(e,t){let o=t.location?.trim()||void 0;return t.scope==="blog"?e.type==="post"?Qt(e.slug):e.type==="tag"?qt(e.slug):null:t.scope==="jobs"?e.type==="company"||e.type==="market"||e.type==="post"||e.type==="tag"?null:e.termType==="skill"?o?$t(o,e.canonicalSlug):Nt(e.canonicalSlug):o?K(o,e.canonicalSlug):V(e.canonicalSlug):e.type==="company"?Dt(e.slug):e.type==="market"?jt(e.slug):null}function $o(e){return`/companies/${h(e)}/salaries`}function Do(e){return`/salaries/titles/${h(e)}`}function jo(e){return`/salaries/skills/${h(e)}`}function Qo(e){return`/salaries/locations/${h(e)}`}function Qt(e){return`/blog/${h(e)}`}function qt(e){return`/blog/tag/${h(e)}`}function qo(e){return`/blog/author/${h(e)}`}function Go(e){return`/p/${h(e)}`}var Y={home:"/",jobs:"/jobs",companies:"/companies",salaries:"/salaries",salaryCompanies:"/salaries/companies",salaryTitles:"/salaries/titles",salarySkills:"/salaries/skills",salaryLocations:"/salaries/locations",blog:"/blog",about:"/about",privacyPolicy:"/privacy-policy",termsOfService:"/terms-of-service",cookiePolicy:"/cookie-policy",impressum:"/impressum",talent:"/talent",employers:"/employers",alertsManage:"/alerts/manage",alertsConfirm:"/alerts/confirm"};function Ho(e){return`/go/job/${e}`}function Vo(){return"/go/alerts-manage"}function Ko(){return"/go/alerts-confirm"}function z(e,t){return`${e.replace(/\/+$/,"")}${t}`}function Gt(e,t={}){let o=e.map(r=>{let i=r.label?.trim();return i?{name:i,href:r.href?.trim()??null}:null}).filter(r=>!!r);return o.length<2?null:{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:o.map((r,i)=>{let s=r.href?Yo(r.href,t.origin??null):null,a={"@type":"ListItem",position:i+1,name:r.name};return s&&(a.item=s),a})}}function Yo(e,t){if(zo(e))return e;if(!t)return null;let o=e.startsWith("/")?e:`/${e}`;return`${t}${o}`}function zo(e){return/^https?:\/\//i.test(e)}function W(e){let t=[{kind:"home",path:Y.home},{kind:"jobs",path:Y.jobs}],o=null;for(let r of e.placeHierarchy)o=r.slug,t.push({kind:"place",name:r.name,path:M(r.slug)});let n=e.categories[0];return n&&t.push({kind:"category",name:n.name,path:o?K(o,n.slug):V(n.slug)}),t.push({kind:"job",name:e.title}),t}var Z=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW"];function Wo(e){try{return new Intl.DisplayNames([e],{type:"region"})}catch{return null}}function Zo(e){try{return new Intl.Collator(e)}catch{return new Intl.Collator}}function Ht(e){let t=C(e);if(!t)return Z.map(r=>({code:r,name:r})).sort((r,i)=>r.code<i.code?-1:r.code>i.code?1:0);let o=Wo(t),n=Zo(t).compare;return Z.map(r=>({code:r,name:o?.of(r)??r})).sort((r,i)=>n(r.name,i.name))}function Xo(e,t){if(!Array.isArray(t)||t.length===0)return null;let o=t.map(n=>e.options?.find(r=>r.key===n)?.label).filter(n=>!!n);return o.length>0?o:null}function en(e,t){switch(e.type){case"number":return null;case"multi_select":return null;case"single_select":return typeof t!="string"?null:e.options?.find(o=>o.key===t)?.label??null;default:return typeof t=="string"&&t.trim()!==""?t:null}}function Vt(e,t,o){let n=[];for(let r of t??[]){let i=o?.[r.key];if(r.type==="boolean"){typeof i=="boolean"&&n.push({key:r.key,label:r.label,kind:"boolean",value:i});continue}if(r.type==="number"){typeof i=="number"&&Number.isFinite(i)&&n.push({key:r.key,label:r.label,kind:"number",value:i});continue}if(r.type==="multi_select"){let a=Xo(r,i);a&&n.push({key:r.key,label:r.label,kind:"multi_select",values:a});continue}let s=en(r,i);s!==null&&n.push({key:r.key,label:r.label,kind:"text",value:s})}return n}var fe={};A(fe,{ALL_COUNTRY_CODES:()=>ue,SENIORITY_ORDER:()=>Q,buildJobBreadcrumbs:()=>W,buildSalaryFaq:()=>Et,companyCategorySalaryJsonLd:()=>xt,companySalaryJsonLd:()=>kt,createAuthorProfileJsonLd:()=>Yt,createBlogArticleJsonLd:()=>Kt,createBreadcrumbJsonLd:()=>Gt,createJobPostingJsonLd:()=>Jt,crossAxisSalaryJsonLd:()=>It,faqJsonLd:()=>At,formatSalaryStat:()=>q,formatSalaryStatRange:()=>k,itemListJsonLd:()=>H,listingHead:()=>zt,listingJsonLd:()=>Wt,locationSalaryJsonLd:()=>Ft,normalizeWebsiteUrl:()=>U,skillSalaryJsonLd:()=>Tt,sortBySeniority:()=>vt,titleSalaryJsonLd:()=>Lt});function Kt({post:e,boardName:t,permalink:o,ogImageUrl:n}){let r={"@context":"https://schema.org","@type":"Article",headline:e.title,url:o,mainEntityOfPage:{"@type":"WebPage","@id":o},publisher:{"@type":"Organization",name:t}};e.customExcerpt&&(r.description=e.customExcerpt),e.publishedAt&&(r.datePublished=e.publishedAt);let i=e.coverUrl??n;i&&(r.image=i);let s=e.authors[0];return s&&(r.author={"@type":"Person",name:s.name,...s.websiteUrl?{url:s.websiteUrl}:{}}),r}function Yt({author:e,canonical:t,description:o,origin:n,posts:r,totalPosts:i}){if(!e.name)return null;let s=o.trim(),a=[X(e.websiteUrl),X(e.twitterUrl),X(e.linkedinUrl),X(e.githubUrl)].filter(d=>!!d),l=`${t}#profile`,c=r.slice(0,5).map(d=>{let y=tn(n,`/blog/${d.slug}`);return y?{"@type":"Article",headline:d.title,url:y,datePublished:d.publishedAt,author:{"@id":l}}:null}).filter(d=>d!==null),p=i>0?{"@type":"InteractionCounter",interactionType:"https://schema.org/WriteAction",userInteractionCount:i}:void 0,m={"@context":"https://schema.org","@type":"ProfilePage",url:t,mainEntity:{"@type":"Person","@id":l,name:e.name,alternateName:e.slug??void 0,identifier:e.id??void 0,description:s||void 0,image:e.avatarUrl??void 0,sameAs:a.length>0?a:void 0,url:t,mainEntityOfPage:t,agentInteractionStatistic:p}};return c.length>0&&(m.hasPart=c),m}function X(e){if(!e)return null;let t=e.trim();if(!t)return null;try{let o=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;return new URL(o).toString()}catch{return null}}function tn(e,t){if(!e||!t)return null;try{return new URL(t,e).toString()}catch{return null}}function zt(e){let t=e.title,o=e.description,n=`${e.origin}${e.path}`;return{meta:[{title:t},{name:"description",content:o},{property:"og:title",content:t},{property:"og:description",content:o},{property:"og:type",content:"website"},{property:"og:url",content:n}],links:[{rel:"canonical",href:n}]}}function Wt(e){let t=[];e.breadcrumbs.length>=2&&t.push({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.breadcrumbs.map((n,r)=>({"@type":"ListItem",position:r+1,name:n.name,...n.path?{item:z(e.origin,n.path)}:{}}))});let o=(e.jobs??[]).filter(n=>n.company!=null&&!!n.company.slug);return o.length>0&&t.push({"@context":"https://schema.org","@type":"ItemList",itemListElement:o.map((n,r)=>({"@type":"ListItem",position:r+1,url:z(e.origin,me(n.company.slug,n.slug))}))}),t}var ge={};A(ge,{createSuggestController:()=>rn});function on(e){return typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError"}function nn(e){try{let t=0;for(let o of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e))t+=1;return t}catch{return[...e].length}}function Zt(e,t){return t.size===0?e.slice():e.filter(o=>!(o.type==="company"&&t.has(o.slug.toLowerCase().normalize("NFC"))))}function rn(e,t){let o=t?.minChars??2,n=t?.debounceMs??250,r=t?.limit,i=!1,s={query:"",items:[],status:"idle",error:null},a=[],l=new Set,c=0,p=null,m=null,d=new Set;function y(){for(let u of d)u()}function f(u){s=u,y()}function O(){p!==null&&(globalThis.clearTimeout(p),p=null)}function g(){m&&(m.abort(),m=null)}function R(u){let b=++c;g();let _=new AbortController;m=_;let E={q:u};r!==void 0&&(E.limit=r),e.search.suggest(E,{signal:_.signal}).then(B=>{i||b!==c||(m=null,a=B.items,f({query:s.query,items:Zt(a,l),status:"ready",error:null}))}).catch(B=>{i||b!==c||on(B)||(m=null,f({query:s.query,items:s.items,status:"error",error:B}))})}return{setQuery(u){if(i)return;let b=u.trim();if(O(),nn(b)<o){c+=1,g(),a=[],f({query:u,items:[],status:"idle",error:null});return}c+=1,g(),f({query:u,items:s.items,status:"loading",error:null}),p=globalThis.setTimeout(()=>{p=null,!i&&R(b)},n)},setExcludedCompanySlugs(u){i||(l=new Set(u.map(b=>b.trim().toLowerCase().normalize("NFC")).filter(Boolean)),f({query:s.query,items:Zt(a,l),status:s.status,error:s.error}))},getState(){return s},subscribe(u){return i?()=>{}:(d.add(u),()=>{d.delete(u)})},dispose(){i||(i=!0,O(),g(),c+=1,d.clear())}}}return ro(sn);})();
|
package/dist/doctor.js
CHANGED
|
@@ -8277,8 +8277,29 @@ var NON_RENDERED = /* @__PURE__ */ new Set([
|
|
|
8277
8277
|
function attribute(node, name) {
|
|
8278
8278
|
return node.attrs.find((attr) => attr.name === name)?.value;
|
|
8279
8279
|
}
|
|
8280
|
-
|
|
8281
|
-
|
|
8280
|
+
var STREAMED_REVEAL = /\$R[CR]\(\s*"[^"]+"\s*,\s*"([^"]+)"|\$RS\(\s*"([^"]+)"/g;
|
|
8281
|
+
function revealedSegmentIds(root) {
|
|
8282
|
+
const ids = /* @__PURE__ */ new Set();
|
|
8283
|
+
function visit(node) {
|
|
8284
|
+
if ("tagName" in node && node.tagName === "script") {
|
|
8285
|
+
for (const child of node.childNodes) {
|
|
8286
|
+
if (child.nodeName !== "#text") continue;
|
|
8287
|
+
const text = child.value;
|
|
8288
|
+
for (const match of text.matchAll(STREAMED_REVEAL)) {
|
|
8289
|
+
ids.add(match[1] ?? match[2]);
|
|
8290
|
+
}
|
|
8291
|
+
}
|
|
8292
|
+
return;
|
|
8293
|
+
}
|
|
8294
|
+
if ("childNodes" in node) node.childNodes.forEach(visit);
|
|
8295
|
+
}
|
|
8296
|
+
visit(root);
|
|
8297
|
+
return ids;
|
|
8298
|
+
}
|
|
8299
|
+
function hidden(node, revealed) {
|
|
8300
|
+
const id = attribute(node, "id");
|
|
8301
|
+
const streamedSegment = node.tagName === "div" && id !== void 0 && revealed.has(id);
|
|
8302
|
+
if (NON_RENDERED.has(node.tagName) || attribute(node, "hidden") !== void 0 && !streamedSegment || attribute(node, "inert") !== void 0 || attribute(node, "aria-hidden")?.toLowerCase() === "true")
|
|
8282
8303
|
return true;
|
|
8283
8304
|
const style = (attribute(node, "style") ?? "").replace(
|
|
8284
8305
|
/\/\*[\s\S]*?\*\//g,
|
|
@@ -8291,24 +8312,26 @@ function hidden(node) {
|
|
|
8291
8312
|
return property === "display" && value === "none" || property === "visibility" && ["hidden", "collapse"].includes(value) || property === "opacity" && value !== "" && Number(value.replace(/%$/, "")) === 0;
|
|
8292
8313
|
});
|
|
8293
8314
|
}
|
|
8294
|
-
function hasContent(node) {
|
|
8315
|
+
function hasContent(node, revealed) {
|
|
8295
8316
|
if (node.nodeName === "#text")
|
|
8296
8317
|
return /\S/.test(node.value);
|
|
8297
8318
|
if ("tagName" in node) {
|
|
8298
|
-
if (hidden(node)) return false;
|
|
8319
|
+
if (hidden(node, revealed)) return false;
|
|
8299
8320
|
if (node.tagName === "img") return Boolean(attribute(node, "alt")?.trim());
|
|
8300
8321
|
if (node.tagName === "svg" && attribute(node, "aria-label")?.trim())
|
|
8301
8322
|
return true;
|
|
8302
8323
|
}
|
|
8303
|
-
return "childNodes" in node && node.childNodes.some(hasContent);
|
|
8324
|
+
return "childNodes" in node && node.childNodes.some((child) => hasContent(child, revealed));
|
|
8304
8325
|
}
|
|
8305
8326
|
function hasCrawlableCavunoBacklink(html) {
|
|
8327
|
+
const root = parse(html);
|
|
8328
|
+
const revealed = revealedSegmentIds(root);
|
|
8306
8329
|
function visit(node) {
|
|
8307
8330
|
if ("tagName" in node) {
|
|
8308
|
-
if (hidden(node)) return false;
|
|
8331
|
+
if (hidden(node, revealed)) return false;
|
|
8309
8332
|
if (node.tagName === "a") {
|
|
8310
8333
|
const href = attribute(node, "href");
|
|
8311
|
-
if (href !== void 0 && hasContent(node)) {
|
|
8334
|
+
if (href !== void 0 && hasContent(node, revealed)) {
|
|
8312
8335
|
try {
|
|
8313
8336
|
const url = new URL(href);
|
|
8314
8337
|
if (["http:", "https:"].includes(url.protocol) && ["cavuno.com", "www.cavuno.com"].includes(url.hostname))
|
|
@@ -8320,7 +8343,7 @@ function hasCrawlableCavunoBacklink(html) {
|
|
|
8320
8343
|
}
|
|
8321
8344
|
return "childNodes" in node && node.childNodes.some(visit);
|
|
8322
8345
|
}
|
|
8323
|
-
return visit(
|
|
8346
|
+
return visit(root);
|
|
8324
8347
|
}
|
|
8325
8348
|
|
|
8326
8349
|
// src/doctor/read.ts
|
package/dist/doctor.mjs
CHANGED
|
@@ -8247,8 +8247,29 @@ var NON_RENDERED = /* @__PURE__ */ new Set([
|
|
|
8247
8247
|
function attribute(node, name) {
|
|
8248
8248
|
return node.attrs.find((attr) => attr.name === name)?.value;
|
|
8249
8249
|
}
|
|
8250
|
-
|
|
8251
|
-
|
|
8250
|
+
var STREAMED_REVEAL = /\$R[CR]\(\s*"[^"]+"\s*,\s*"([^"]+)"|\$RS\(\s*"([^"]+)"/g;
|
|
8251
|
+
function revealedSegmentIds(root) {
|
|
8252
|
+
const ids = /* @__PURE__ */ new Set();
|
|
8253
|
+
function visit(node) {
|
|
8254
|
+
if ("tagName" in node && node.tagName === "script") {
|
|
8255
|
+
for (const child of node.childNodes) {
|
|
8256
|
+
if (child.nodeName !== "#text") continue;
|
|
8257
|
+
const text = child.value;
|
|
8258
|
+
for (const match of text.matchAll(STREAMED_REVEAL)) {
|
|
8259
|
+
ids.add(match[1] ?? match[2]);
|
|
8260
|
+
}
|
|
8261
|
+
}
|
|
8262
|
+
return;
|
|
8263
|
+
}
|
|
8264
|
+
if ("childNodes" in node) node.childNodes.forEach(visit);
|
|
8265
|
+
}
|
|
8266
|
+
visit(root);
|
|
8267
|
+
return ids;
|
|
8268
|
+
}
|
|
8269
|
+
function hidden(node, revealed) {
|
|
8270
|
+
const id = attribute(node, "id");
|
|
8271
|
+
const streamedSegment = node.tagName === "div" && id !== void 0 && revealed.has(id);
|
|
8272
|
+
if (NON_RENDERED.has(node.tagName) || attribute(node, "hidden") !== void 0 && !streamedSegment || attribute(node, "inert") !== void 0 || attribute(node, "aria-hidden")?.toLowerCase() === "true")
|
|
8252
8273
|
return true;
|
|
8253
8274
|
const style = (attribute(node, "style") ?? "").replace(
|
|
8254
8275
|
/\/\*[\s\S]*?\*\//g,
|
|
@@ -8261,24 +8282,26 @@ function hidden(node) {
|
|
|
8261
8282
|
return property === "display" && value === "none" || property === "visibility" && ["hidden", "collapse"].includes(value) || property === "opacity" && value !== "" && Number(value.replace(/%$/, "")) === 0;
|
|
8262
8283
|
});
|
|
8263
8284
|
}
|
|
8264
|
-
function hasContent(node) {
|
|
8285
|
+
function hasContent(node, revealed) {
|
|
8265
8286
|
if (node.nodeName === "#text")
|
|
8266
8287
|
return /\S/.test(node.value);
|
|
8267
8288
|
if ("tagName" in node) {
|
|
8268
|
-
if (hidden(node)) return false;
|
|
8289
|
+
if (hidden(node, revealed)) return false;
|
|
8269
8290
|
if (node.tagName === "img") return Boolean(attribute(node, "alt")?.trim());
|
|
8270
8291
|
if (node.tagName === "svg" && attribute(node, "aria-label")?.trim())
|
|
8271
8292
|
return true;
|
|
8272
8293
|
}
|
|
8273
|
-
return "childNodes" in node && node.childNodes.some(hasContent);
|
|
8294
|
+
return "childNodes" in node && node.childNodes.some((child) => hasContent(child, revealed));
|
|
8274
8295
|
}
|
|
8275
8296
|
function hasCrawlableCavunoBacklink(html) {
|
|
8297
|
+
const root = parse(html);
|
|
8298
|
+
const revealed = revealedSegmentIds(root);
|
|
8276
8299
|
function visit(node) {
|
|
8277
8300
|
if ("tagName" in node) {
|
|
8278
|
-
if (hidden(node)) return false;
|
|
8301
|
+
if (hidden(node, revealed)) return false;
|
|
8279
8302
|
if (node.tagName === "a") {
|
|
8280
8303
|
const href = attribute(node, "href");
|
|
8281
|
-
if (href !== void 0 && hasContent(node)) {
|
|
8304
|
+
if (href !== void 0 && hasContent(node, revealed)) {
|
|
8282
8305
|
try {
|
|
8283
8306
|
const url = new URL(href);
|
|
8284
8307
|
if (["http:", "https:"].includes(url.protocol) && ["cavuno.com", "www.cavuno.com"].includes(url.hostname))
|
|
@@ -8290,7 +8313,7 @@ function hasCrawlableCavunoBacklink(html) {
|
|
|
8290
8313
|
}
|
|
8291
8314
|
return "childNodes" in node && node.childNodes.some(visit);
|
|
8292
8315
|
}
|
|
8293
|
-
return visit(
|
|
8316
|
+
return visit(root);
|
|
8294
8317
|
}
|
|
8295
8318
|
|
|
8296
8319
|
// src/doctor/read.ts
|
package/dist/index.d.mts
CHANGED
|
@@ -202,7 +202,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
202
202
|
* constant because the package is platform-neutral and cannot read
|
|
203
203
|
* package.json at runtime.
|
|
204
204
|
*/
|
|
205
|
-
declare const SDK_VERSION = "4.31.
|
|
205
|
+
declare const SDK_VERSION = "4.31.1";
|
|
206
206
|
|
|
207
207
|
type SavedJob = Schemas['SavedJob'];
|
|
208
208
|
type SavedJobsListQuery = {
|
package/dist/index.d.ts
CHANGED
|
@@ -202,7 +202,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
202
202
|
* constant because the package is platform-neutral and cannot read
|
|
203
203
|
* package.json at runtime.
|
|
204
204
|
*/
|
|
205
|
-
declare const SDK_VERSION = "4.31.
|
|
205
|
+
declare const SDK_VERSION = "4.31.1";
|
|
206
206
|
|
|
207
207
|
type SavedJob = Schemas['SavedJob'];
|
|
208
208
|
type SavedJobsListQuery = {
|
package/dist/index.js
CHANGED
package/dist/index.mjs
CHANGED
package/dist/server.d.mts
CHANGED
|
@@ -111,26 +111,31 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
|
|
|
111
111
|
}): string | null;
|
|
112
112
|
|
|
113
113
|
/**
|
|
114
|
-
*
|
|
115
|
-
* session
|
|
116
|
-
*
|
|
114
|
+
* Session refresh for server-rendered apps. Each call rotates the given
|
|
115
|
+
* session's refresh token with `board.auth.refresh` and maps the result to a
|
|
116
|
+
* `BoardSession`.
|
|
117
117
|
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
118
|
+
* No state is held across calls. The refresher is usually module-scoped and
|
|
119
|
+
* shared by every request, so a promise kept between calls would be shared
|
|
120
|
+
* across requests too. On edge runtimes such as Cloudflare Workers, I/O
|
|
121
|
+
* belongs to the request that started it: when that request is cancelled
|
|
122
|
+
* (for example the client disconnects), its fetch is cancelled and a promise
|
|
123
|
+
* waiting on it never settles. Any later request awaiting that shared promise
|
|
124
|
+
* would hang. Each call therefore performs its own refresh.
|
|
123
125
|
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
126
|
+
* Concurrent refreshes of the same session are safe without client-side
|
|
127
|
+
* coordination: the refresh endpoint returns the same successor refresh token
|
|
128
|
+
* for a token re-presented within a short grace window, so parallel calls
|
|
129
|
+
* (in one process or across instances) converge on one refresh token. Their
|
|
130
|
+
* access tokens may differ; each is valid.
|
|
131
|
+
*
|
|
132
|
+
* Pair with `storage: 'nostore'` on the shared server client.
|
|
133
|
+
* `auth.refresh` persists the rotated pair into `client.storage`, and any
|
|
134
|
+
* persistent shared storage would bleed one user's tokens into another's
|
|
135
|
+
* requests.
|
|
131
136
|
*
|
|
132
137
|
* Returns the rotated `BoardSession` (persist it back to the cookie), or
|
|
133
|
-
* `null` on a 401
|
|
138
|
+
* `null` on a 401: the token is expired or revoked, so clear the cookie and
|
|
134
139
|
* continue signed out, never retry. Other errors (network, 5xx, 429)
|
|
135
140
|
* rethrow untouched.
|
|
136
141
|
*
|
package/dist/server.d.ts
CHANGED
|
@@ -111,26 +111,31 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
|
|
|
111
111
|
}): string | null;
|
|
112
112
|
|
|
113
113
|
/**
|
|
114
|
-
*
|
|
115
|
-
* session
|
|
116
|
-
*
|
|
114
|
+
* Session refresh for server-rendered apps. Each call rotates the given
|
|
115
|
+
* session's refresh token with `board.auth.refresh` and maps the result to a
|
|
116
|
+
* `BoardSession`.
|
|
117
117
|
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
118
|
+
* No state is held across calls. The refresher is usually module-scoped and
|
|
119
|
+
* shared by every request, so a promise kept between calls would be shared
|
|
120
|
+
* across requests too. On edge runtimes such as Cloudflare Workers, I/O
|
|
121
|
+
* belongs to the request that started it: when that request is cancelled
|
|
122
|
+
* (for example the client disconnects), its fetch is cancelled and a promise
|
|
123
|
+
* waiting on it never settles. Any later request awaiting that shared promise
|
|
124
|
+
* would hang. Each call therefore performs its own refresh.
|
|
123
125
|
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
126
|
+
* Concurrent refreshes of the same session are safe without client-side
|
|
127
|
+
* coordination: the refresh endpoint returns the same successor refresh token
|
|
128
|
+
* for a token re-presented within a short grace window, so parallel calls
|
|
129
|
+
* (in one process or across instances) converge on one refresh token. Their
|
|
130
|
+
* access tokens may differ; each is valid.
|
|
131
|
+
*
|
|
132
|
+
* Pair with `storage: 'nostore'` on the shared server client.
|
|
133
|
+
* `auth.refresh` persists the rotated pair into `client.storage`, and any
|
|
134
|
+
* persistent shared storage would bleed one user's tokens into another's
|
|
135
|
+
* requests.
|
|
131
136
|
*
|
|
132
137
|
* Returns the rotated `BoardSession` (persist it back to the cookie), or
|
|
133
|
-
* `null` on a 401
|
|
138
|
+
* `null` on a 401: the token is expired or revoked, so clear the cookie and
|
|
134
139
|
* continue signed out, never retry. Other errors (network, 5xx, 429)
|
|
135
140
|
* rethrow untouched.
|
|
136
141
|
*
|
package/dist/server.js
CHANGED
|
@@ -224,24 +224,19 @@ function createSessionRefresher(board) {
|
|
|
224
224
|
"createSessionRefresher requires the server client to use storage: 'nostore' \u2014 a shared persistent store would leak rotated tokens across requests. Keep the session in the httpOnly cookie and pass tokens per call."
|
|
225
225
|
);
|
|
226
226
|
}
|
|
227
|
-
const inflight = /* @__PURE__ */ new Map();
|
|
228
227
|
return async function refresh(session) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
228
|
+
try {
|
|
229
|
+
const rotated = await board.auth.refresh({
|
|
230
|
+
refreshToken: session.refreshToken
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
234
233
|
accessToken: rotated.accessToken,
|
|
235
234
|
refreshToken: rotated.refreshToken,
|
|
236
235
|
expiresAt: rotated.expiresAt
|
|
237
|
-
}
|
|
238
|
-
|
|
236
|
+
};
|
|
237
|
+
} catch (error) {
|
|
239
238
|
if (isUnauthorized(error)) return null;
|
|
240
239
|
throw error;
|
|
241
|
-
}
|
|
242
|
-
inflight.delete(key);
|
|
243
|
-
});
|
|
244
|
-
inflight.set(key, attempt);
|
|
245
|
-
return attempt;
|
|
240
|
+
}
|
|
246
241
|
};
|
|
247
242
|
}
|
package/dist/server.mjs
CHANGED
|
@@ -159,25 +159,20 @@ function createSessionRefresher(board) {
|
|
|
159
159
|
"createSessionRefresher requires the server client to use storage: 'nostore' \u2014 a shared persistent store would leak rotated tokens across requests. Keep the session in the httpOnly cookie and pass tokens per call."
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
|
-
const inflight = /* @__PURE__ */ new Map();
|
|
163
162
|
return async function refresh(session) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
try {
|
|
164
|
+
const rotated = await board.auth.refresh({
|
|
165
|
+
refreshToken: session.refreshToken
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
169
168
|
accessToken: rotated.accessToken,
|
|
170
169
|
refreshToken: rotated.refreshToken,
|
|
171
170
|
expiresAt: rotated.expiresAt
|
|
172
|
-
}
|
|
173
|
-
|
|
171
|
+
};
|
|
172
|
+
} catch (error) {
|
|
174
173
|
if (isUnauthorized(error)) return null;
|
|
175
174
|
throw error;
|
|
176
|
-
}
|
|
177
|
-
inflight.delete(key);
|
|
178
|
-
});
|
|
179
|
-
inflight.set(key, attempt);
|
|
180
|
-
return attempt;
|
|
175
|
+
}
|
|
181
176
|
};
|
|
182
177
|
}
|
|
183
178
|
export {
|
package/package.json
CHANGED
|
@@ -58,7 +58,7 @@ try {
|
|
|
58
58
|
}
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
On SSR, use the module-scoped `createSessionRefresher` pattern in `cavuno-board-server-sessions`; it is the single source of truth for
|
|
61
|
+
On SSR, use the module-scoped `createSessionRefresher` pattern in `cavuno-board-server-sessions`; it is the single source of truth for cookies, retry limits, and per-call authorization headers.
|
|
62
62
|
|
|
63
63
|
**Complete when:** concurrent expiry paths share one rotation and the original operation is attempted at most once after a successful refresh.
|
|
64
64
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cavuno-board-server-sessions
|
|
3
|
-
description: Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers,
|
|
3
|
+
description: Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, session refresh, grant cookies, or safe redirect-back handling.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Wire server sessions
|
|
@@ -11,7 +11,7 @@ The server contract has three invariants:
|
|
|
11
11
|
|
|
12
12
|
1. One module-scoped board client uses server-default `nostore`.
|
|
13
13
|
2. Each request reads an app-owned httpOnly cookie and passes credentials in that call's headers.
|
|
14
|
-
3. One module-scoped `createSessionRefresher(board)`
|
|
14
|
+
3. One module-scoped `createSessionRefresher(board)` refreshes expiring sessions. It holds no state between requests.
|
|
15
15
|
|
|
16
16
|
## 1. Persist the board-user session
|
|
17
17
|
|
|
@@ -41,7 +41,7 @@ const clearedCookie = clearSessionCookie();
|
|
|
41
41
|
|
|
42
42
|
## 2. Resolve one fresh session per request
|
|
43
43
|
|
|
44
|
-
Refresh tokens rotate
|
|
44
|
+
Refresh tokens rotate on use. Create the refresher beside the shared client. Each call performs its own refresh; concurrent requests presenting the same refresh token within a short grace window receive the same successor refresh token, so they converge without client-side coordination. `isExpiringSoon` selects sessions within the proactive five-minute window.
|
|
45
45
|
|
|
46
46
|
```ts snippet
|
|
47
47
|
import {
|
|
@@ -68,9 +68,9 @@ async function resolveSession(cookieHeader: string | null) {
|
|
|
68
68
|
}
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
A rotated session is written back before the response completes. A `null` result represents a 401 from a burned or revoked token: clear the cookie and continue signed out. Network, 5xx, and 429 failures rethrow to the app's error boundary. The helper
|
|
71
|
+
A rotated session is written back before the response completes. A `null` result represents a 401 from a burned or revoked token: clear the cookie and continue signed out. Network, 5xx, and 429 failures rethrow to the app's error boundary. The helper keeps no in-flight promise between requests: on edge runtimes such as Cloudflare Workers, a promise started by a request that is later cancelled never settles, and sharing it would hang every later request for that session.
|
|
72
72
|
|
|
73
|
-
**Complete when:** two simultaneous resolutions for one expiring session
|
|
73
|
+
**Complete when:** two simultaneous resolutions for one expiring session both succeed with the same refresh token, success writes the rotated pair, and `null` produces one clear-cookie response with no refresh retry.
|
|
74
74
|
|
|
75
75
|
## 3. Authenticate each SDK call
|
|
76
76
|
|
|
@@ -48,7 +48,7 @@ Use `cavuno-board-format`, `cavuno-board-filters`, and `cavuno-board-search-sugg
|
|
|
48
48
|
|
|
49
49
|
Use `cavuno-board-auth` for board-user registration, login, verification, recovery, and browser storage. In a server-rendered app, use `cavuno-board-server-sessions` as the authority for the httpOnly session cookie, per-call bearer header, and `createSessionRefresher`. Use `cavuno-board-errors` for typed failure branches and board-password grants.
|
|
50
50
|
|
|
51
|
-
**Complete when:** an authenticated `board.me.retrieve()` succeeds, logout returns the app to a signed-out state, and
|
|
51
|
+
**Complete when:** an authenticated `board.me.retrieve()` succeeds, logout returns the app to a signed-out state, and server requests refresh expiring sessions through the server skill's module-scoped refresher.
|
|
52
52
|
|
|
53
53
|
## 5. Add only the enabled surfaces
|
|
54
54
|
|
package/skills/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "4.31.
|
|
2
|
+
"version": "4.31.1",
|
|
3
3
|
"skills": [
|
|
4
4
|
{
|
|
5
5
|
"name": "cavuno-board-account",
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
"name": "cavuno-board-server-sessions",
|
|
139
|
-
"description": "Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers,
|
|
139
|
+
"description": "Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, session refresh, grant cookies, or safe redirect-back handling.",
|
|
140
140
|
"path": "skills/cavuno-board-server-sessions/SKILL.md",
|
|
141
141
|
"framework": null,
|
|
142
142
|
"category": "core"
|