@cavuno/board 4.22.0 → 4.23.0
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 +9 -0
- package/dist/browser/cavuno-board.global.min.js +1 -1
- 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/sitemap.d.mts +31 -1
- package/dist/sitemap.d.ts +31 -1
- package/dist/sitemap.js +34 -9
- package/dist/sitemap.mjs +34 -9
- package/package.json +1 -1
- package/skills/cavuno-board-sitemap/SKILL.md +51 -2
- package/skills/manifest.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
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.23.0 — 2026-09-06
|
|
7
|
+
|
|
8
|
+
- **`buildBucketEntries(board, origin, bucket)`** and
|
|
9
|
+
**`listedBucketEntries(board)`** in `@cavuno/board/sitemap`: the same walk as
|
|
10
|
+
`buildBucketUrls` / `listedBuckets`, keeping the `lastModified` the Board API
|
|
11
|
+
publishes per URL and per bucket so `renderUrlset` / `renderSitemapIndex`
|
|
12
|
+
emit `<lastmod>`. New type `ListedSitemapBucket`. The string-returning
|
|
13
|
+
walkers are unchanged.
|
|
14
|
+
|
|
6
15
|
## 4.22.0 — 2026-09-05
|
|
7
16
|
|
|
8
17
|
- **`board.me.companies.startMembershipCheckout(slug, body)`** and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var CavunoBoard=(()=>{var J=Object.defineProperty;var jt=Object.getOwnPropertyDescriptor;var Qt=Object.getOwnPropertyNames;var qt=Object.prototype.hasOwnProperty;var Gt=(t,e,o)=>e in t?J(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var _=(t,e)=>{for(var o in e)J(t,o,{get:e[o],enumerable:!0})},Ht=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Qt(e))!qt.call(t,r)&&r!==o&&J(t,r,{get:()=>e[r],enumerable:!(n=jt(e,r))||n.enumerable});return t};var Vt=t=>Ht(J({},"__esModule",{value:!0}),t);var E=(t,e,o)=>Gt(t,typeof e!="symbol"?e+"":e,o);var jo={};_(jo,{ACCESS_TOKEN_KEY:()=>T,BOARD_ACCESS_GRANT_KEY:()=>F,BOARD_API_ERROR_CODES:()=>de,BoardApiError:()=>A,BoardClient:()=>I,REFRESH_TOKEN_KEY:()=>L,SDK_VERSION:()=>N,createBoardClient:()=>eo,filters:()=>te,format:()=>ce,isBoardApiError:()=>B,isBoardPasswordRequired:()=>fe,isColdRule:()=>Ye,isConflict:()=>Ce,isForbidden:()=>he,isFreeEmailWebsiteError:()=>Oe,isNotFound:()=>ye,isOwnMessage:()=>Ke,isRateLimited:()=>Se,isSafeApplicationUrl:()=>X,isUnauthorized:()=>ge,isValidationError:()=>be,lastOwnMessageId:()=>We,paginate:()=>Ve,paths:()=>pe,resolveApplyAction:()=>ze,resolveApplyDecision:()=>ee,seo:()=>ue,suggest:()=>me});var de=["internal_error","validation_bad_request","validation_payload_too_large","rate_limited","rate_limit_unavailable","search_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","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","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","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","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"],A=class extends Error{constructor(o){super(o.message);E(this,"status");E(this,"code");E(this,"details");E(this,"requestId");E(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 B(t){return t instanceof Error&&t.name==="BoardApiError"&&typeof t.status=="number"&&typeof t.code=="string"}function ye(t){return B(t)&&t.status===404}function ge(t){return B(t)&&t.status===401}function fe(t){return B(t)&&t.status===401&&t.code==="board_password_required"}function he(t){return B(t)&&t.status===403}function be(t){return B(t)&&t.status===400&&t.code==="validation_bad_request"}function Se(t){return B(t)&&t.status===429}function Ce(t){return B(t)&&t.status===409}function Oe(t){return B(t)&&t.status===422&&t.code==="employer_free_email_website"}function Ee(t){let e=new URLSearchParams;if(!t)return e;for(let[o,n]of Object.entries(t))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&e.append(o,String(r));else e.append(o,String(n));return e}function Be(t){let e=5381;for(let n=0;n<t.length;n++)e=(e<<5)+e+t.charCodeAt(n)>>>0;return`${t.replace(/[^a-zA-Z0-9_-]/g,"_")}-${e.toString(36)}`}var T="cavuno_board_access_token",L="cavuno_board_refresh_token",F="cavuno_board_access_grant";function Pe(){return typeof globalThis.document<"u"}function Kt(){let t=new Map;return{getItem:e=>t.get(e)??null,setItem:(e,o)=>{t.set(e,o)},removeItem:e=>{t.delete(e)}}}function Yt(t,e){if(!Pe())throw new Error(`storage mode '${t}' is browser-only \u2014 use 'nostore' + per-call headers on the server`);let o;try{if(o=t==="local"?globalThis.localStorage:globalThis.sessionStorage,!o)throw new Error("unavailable")}catch{throw new Error(`storage mode '${t}' 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=e?`:${Be(e)}`:"";return{getItem:r=>o.getItem(`${r}${n}`),setItem:(r,i)=>{o.setItem(`${r}${n}`,i)},removeItem:r=>{o.removeItem(`${r}${n}`)}}}var Wt=Symbol.for("@cavuno/board:nostore");var zt={[Wt]:!0,getItem:()=>null,setItem:()=>{},removeItem:()=>{}};function ve(t,e){let o=t??(Pe()?"memory":"nostore");if(typeof o=="object")return o;switch(o){case"memory":return Kt();case"nostore":return zt;case"local":case"session":return Yt(o,e);default:throw new Error(`Unknown storage mode '${String(o)}'`)}}async function w(t,e){await t.setItem(T,e.accessToken),await t.setItem(L,e.refreshToken)}async function Ae(t){await t.removeItem(T),await t.removeItem(L)}var N="4.22.0";function Zt(t){return typeof t=="string"||t instanceof URLSearchParams||typeof FormData<"u"&&t instanceof FormData||typeof Blob<"u"&&t instanceof Blob||t instanceof ArrayBuffer||typeof ReadableStream<"u"&&t instanceof ReadableStream}function Xt(t){try{let e=new URL(t);for(let o of new Set(e.searchParams.keys()))e.searchParams.delete(o),e.searchParams.set(o,"[REDACTED]");return e.toString()}catch{return t.replace(/([?&][^=&#]+)=([^&#]*)/g,"$1=[REDACTED]")}}var I=class{constructor(e){E(this,"storage");E(this,"basePath");E(this,"options");this.options=e,this.storage=e.storage;let o=e.baseUrl.replace(/\/+$/,"");this.basePath=`${o}/v1/boards/${encodeURIComponent(e.board)}`}async fetch(e,o={}){let{body:n,query:r,headers:i,...a}=o,s=(o.method??"GET").toUpperCase(),p=`${this.basePath}${e}`,u=Ee(r).toString();u&&(p+=`?${u}`);let d=n!==void 0&&!Zt(n),m=n===void 0?void 0:d?JSON.stringify(n):n,y=new Headers({accept:"application/json"});d&&y.set("content-type","application/json");for(let[v,Z]of Object.entries(this.options.globalHeaders??{}))y.set(v,Z);let g=await this.storage.getItem(T);g!==null&&y.set("authorization",`Bearer ${g}`);let C=await this.storage.getItem(F);C!==null&&y.set("x-board-access",C),i&&new Headers(i).forEach((v,Z)=>{y.set(Z,v)}),(s!=="GET"||y.has("authorization")||y.has("x-board-access"))&&!y.has("x-cavuno-sdk")&&y.set("x-cavuno-sdk",`board@${N}`);let f={url:p,init:{...a,method:s,headers:y,body:m}};this.options.onRequest&&(f=await this.options.onRequest(f));let P=Xt(f.url);this.options.logger?.debug(`${s} ${P}`);let c=await globalThis.fetch(f.url,f.init);if(this.options.logger?.debug(`${c.status} ${s} ${P}`),this.options.onResponse&&await this.options.onResponse(c.clone(),f),c.status===204)return;if(c.ok)return await c.json();let b;try{b=await c.json()}catch{b=void 0}let O=b?.error,R=O&&typeof O.code=="string"&&typeof O.message=="string"?new A({status:c.status,code:O.code,message:O.message,details:O.details,requestId:O.requestId,raw:b}):new A({status:c.status,code:"unknown_error",message:c.statusText||"Request failed",raw:b});throw this.options.logger?.error(`${R.status} ${R.code} ${s} ${P}`),R}};var Re="https://api.cavuno.com";function _e(t){async function e(n){return await w(t.storage,n),n}async function o(n){if(n?.refreshToken)return n.refreshToken;let r=await t.storage.getItem(L);if(r===null)throw new Error("No refresh token available \u2014 pass { refreshToken } or configure auth.storage");return r}return{async register(n,r){let i=await t.fetch("/auth/register",{...r,method:"POST",body:n});return e(i)},async login(n,r){let i=await t.fetch("/auth/login",{...r,method:"POST",body:n});return e(i)},async refresh(n,r){let i=await o(n),a=await t.fetch("/auth/refresh",{...r,method:"POST",body:{refreshToken:i}});return e(a)},async logout(n,r){let i=await o(n);await t.fetch("/auth/logout",{...r,method:"POST",body:{refreshToken:i}}),await Ae(t.storage)},verifyEmail(n,r){return t.fetch("/auth/verify-email",{...r,method:"POST",body:n})},verifyWorkEmail(n,r){return t.fetch("/auth/verify-work-email",{...r,method:"POST",body:n})},verifyEmailWithCode(n,r){return t.fetch("/auth/verify-email/otp",{...r,method:"POST",body:n})},resendVerification(n){return t.fetch("/auth/verify-email/resend",{...n,method:"POST"})},forgotPassword(n,r){return t.fetch("/auth/forgot-password",{...r,method:"POST",body:n})},resetPassword(n,r){return t.fetch("/auth/reset-password",{...r,method:"POST",body:n})},requestMagicLink(n,r){return t.fetch("/auth/magic-link",{...r,method:"POST",body:n})},async consumeMagicLink(n,r){let i=await t.fetch("/auth/magic-link/consume",{...r,method:"POST",body:n});return e(i)},getOAuthAuthorizationUrl(n,r,i){return t.fetch(`/auth/oauth/${n}`,{...i,method:"GET",query:r})},async exchangeOAuth(n,r){let i=await t.fetch("/auth/oauth/exchange",{...r,method:"POST",body:n});return e(i)}}}function Te(t){return{posts:{list(e,o){return t.fetch("/blog/posts",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/posts/${encodeURIComponent(e)}`,{...n,query:o})},adjacent(e,o){return t.fetch(`/blog/posts/${encodeURIComponent(e)}/adjacent`,o)},similar(e,o,n){return t.fetch(`/blog/posts/${encodeURIComponent(e)}/similar`,{...n,query:o})}},tags:{list(e,o){return t.fetch("/blog/tags",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/tags/${encodeURIComponent(e)}`,{...n,query:o})}},authors:{list(e,o){return t.fetch("/blog/authors",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/authors/${encodeURIComponent(e)}`,{...n,query:o})}},search(e,o,n){return t.fetch("/blog/search",{...n,method:"POST",body:e,query:o})}}}function Le(t){let e=Object.assign((n,r)=>t.fetch("/companies/markets",{...r,query:n}),{resolve(n,r){return t.fetch(`/companies/markets/${encodeURIComponent(n)}`,r)}}),o=Object.assign((n,r)=>t.fetch(`/companies/${encodeURIComponent(n)}/salaries`,r),{summary(n,r){return t.fetch(`/companies/${encodeURIComponent(n)}/salaries/summary`,r)},category(n,r,i,a){return t.fetch(`/companies/${encodeURIComponent(n)}/salaries/${encodeURIComponent(r)}`,{...a,query:i})}});return{list(n,r){return t.fetch("/companies",{...r,query:n})},retrieve(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}`,{...i,query:r})},search(n,r,i){return t.fetch("/companies/search",{...i,method:"POST",body:n,query:r})},listJobs(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}/jobs`,{...i,query:r})},similar(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}/similar`,{...i,query:r})},markets:e,salaries:o}}function Fe(t){return{jobs(e,o){return t.fetch("/embed/jobs",{...o,query:e})}}}function Ie(t){return{subscribe(e,o){return t.fetch("/job-alerts",{...o,method:"POST",body:e})},confirm(e,o){return t.fetch("/job-alerts/confirm",{...o,method:"POST",body:e})},resendConfirmation(e,o){return t.fetch("/job-alerts/resend-confirmation",{...o,method:"POST",body:e})},manage(e,o){return t.fetch("/job-alerts/manage",{...o,query:e})},unsubscribe(e,o){return t.fetch("/job-alerts/unsubscribe",{...o,method:"POST",body:e})},resubscribe(e,o){return t.fetch("/job-alerts/resubscribe",{...o,method:"POST",body:e})},updatePreference(e,o){return t.fetch("/job-alerts/preferences",{...o,method:"POST",body:e})},deletePreference(e,o){return t.fetch("/job-alerts/preferences",{...o,method:"DELETE",body:e})}}}function xe(t){return{plans(e,o){return t.fetch("/job-postings/plans",{...o,query:e})},create(e,o){return t.fetch("/job-postings",{...o,method:"POST",body:e})},uploadLogo(e,o){let n=new FormData;return n.append("file",e),t.fetch("/job-postings/logo",{...o,method:"POST",body:n})},fetchLogoByDomain(e,o){return t.fetch("/job-postings/logo/fetch",{...o,query:{domain:e}})},sendBillingVerification(e,o){return t.fetch("/job-postings/send-verification",{...o,method:"POST",body:e})},getBillingOptions(e,o){return t.fetch("/job-postings/billing-options",{...o,method:"POST",body:e})}}}function ke(t){return{list(e,o){return t.fetch("/jobs",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}`,{...n,query:o})},search(e,o,n){return t.fetch("/jobs/search",{...n,method:"POST",body:e,query:o})},similar(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/similar`,{...n,query:o})},apply(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply`,{...n,method:"POST",body:o??{}})},createApplyIntent(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply-intents`,{...n,method:"POST",body:o})},prepareApplyApproval(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply-approvals`,{...n,method:"POST",body:o})},uploadApplicationResume(e,o,n,r){let i=new FormData;return i.append("file",o),n?.applicationId&&i.append("applicationId",n.applicationId),t.fetch(`/jobs/${encodeURIComponent(e)}/apply/resume`,{...r,method:"POST",body:i})},myApplication(e,o){return t.fetch(`/jobs/${encodeURIComponent(e)}/application`,o)}}}function Ue(t){return{retrieve(e,o){return t.fetch("/me",{...o,query:e})},delete(e){return t.fetch("/me",{...e,method:"DELETE"})},async updatePassword(e,o){let n=await t.fetch("/me/password",{...o,method:"POST",body:e});return await w(t.storage,n),n},requestEmailChange(e,o){return t.fetch("/me/email",{...o,method:"POST",body:e})},confirmEmailChange(e,o){return t.fetch("/me/email/confirm",{...o,method:"POST",body:e})},acceptInvite(e,o){return t.fetch("/me/invites/accept",{...o,method:"POST",body:e})},profile:{retrieve(e,o){return t.fetch("/me/profile",{...o,query:e})},update(e,o,n){return t.fetch("/me/profile",{...n,method:"PATCH",body:e,query:o})},handleAvailable(e,o){return t.fetch("/me/profile/handle-available",{...o,query:{handle:e}})},listExperience(e){return t.fetch("/me/profile/experience",e)},createExperience(e,o){return t.fetch("/me/profile/experience",{...o,method:"POST",body:e})},updateExperience(e,o,n){return t.fetch(`/me/profile/experience/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},deleteExperience(e,o){return t.fetch(`/me/profile/experience/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listEducation(e){return t.fetch("/me/profile/education",e)},createEducation(e,o){return t.fetch("/me/profile/education",{...o,method:"POST",body:e})},updateEducation(e,o,n){return t.fetch(`/me/profile/education/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},deleteEducation(e,o){return t.fetch(`/me/profile/education/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listSkills(e){return t.fetch("/me/profile/skills",e)},updateSkills(e,o){return t.fetch("/me/profile/skills",{...o,method:"PUT",body:e})},listLanguages(e){return t.fetch("/me/profile/languages",e)},updateLanguages(e,o){return t.fetch("/me/profile/languages",{...o,method:"PUT",body:e})},uploadAvatar(e,o){let n=new FormData;return n.append("file",e),t.fetch("/me/profile/avatar",{...o,method:"POST",body:n})}},notificationPreferences:{retrieve(e){return t.fetch("/me/notification-preferences",e)},update(e,o){return t.fetch("/me/notification-preferences",{...o,method:"PUT",body:e})},unsubscribeWithToken(e,o){return t.fetch("/me/notification-preferences/unsubscribe",{...o,method:"POST",body:e})}},companies:{search(e,o){return t.fetch("/me/companies/search",{...o,query:e})},list(e){return t.fetch("/me/companies",e)},create(e,o){return t.fetch("/me/companies",{...o,method:"POST",body:e})},claim(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/claim`,{...o,method:"POST"})},cancelClaim(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/claim`,{...o,method:"DELETE"})},retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,o)},update(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},delete(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listMembers(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members`,o)},updateMemberRole(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},removeMember(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},leave(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership`,{...o,method:"DELETE"})},startMembershipCheckout(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership/checkout`,{...n,method:"POST",body:o})},retrieveMembershipCheckout(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership/checkout/${encodeURIComponent(o)}`,n)},listInvites(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites`,o)},createInvite(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites`,{...n,method:"POST",body:o})},revokeInvite(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},uploadLogo(e,o,n){let r=new FormData;return r.append("file",o),t.fetch(`/me/companies/${encodeURIComponent(e)}/logo`,{...n,method:"POST",body:r})},workEmail:{verify(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/work-email/verify`,{...n,method:"POST",body:o})},confirm(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/work-email/confirm`,{...n,method:"POST",body:o})}},jobs:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs`,{...n,query:o})},retrieve(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,n)},create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},delete(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},publish(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/publish`,{...n,method:"POST"})},unpublish(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/unpublish`,{...n,method:"POST"})},checkout(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/checkout`,{...r,method:"POST",body:n})}},billingOptions:{list(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/billing-options`,o)}},billingPortal:{create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/billing-portal`,{...n,method:"POST",body:o})}},jobStats:{retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/job-stats`,o)},timeseries(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/job-stats/timeseries`,{...n,query:o})}},profileStats:{retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/profile-stats`,o)},timeseries(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/profile-stats/timeseries`,{...n,query:o})}},recommendedTalent:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/recommended-talent`,{...n,query:o})}},talentLists:{list(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists`,o)},create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists/${encodeURIComponent(o)}`,{...n,method:"DELETE"})}},sourcedCandidates:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates`,{...n,query:o})},add(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates`,{...n,method:"POST",body:o})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},convert(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates/${encodeURIComponent(o)}/convert`,{...r,method:"POST",body:n})}},applicants:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants`,{...n,query:o})},move(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/${encodeURIComponent(o)}/stage`,{...r,method:"PATCH",body:n})},bulkMove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/bulk/move`,{...n,method:"POST",body:o})},bulkReject(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/bulk/reject`,{...n,method:"POST",body:o})},addNote(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/${encodeURIComponent(o)}/notes`,{...r,method:"POST",body:n})}},pipelineStages:{create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},reorder(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/reorder`,{...n,method:"PUT",body:o})}}},talentAccess:{retrieve(e){return t.fetch("/me/talent-access",e)},retrieveCandidate(e,o){return t.fetch(`/me/talent-access/candidates/${encodeURIComponent(e)}`,o)},checkout(e,o){return t.fetch("/me/talent-access/checkout",{...o,method:"POST",body:e})},retrieveCheckout(e,o){return t.fetch(`/me/talent-access/checkout/${encodeURIComponent(e)}`,o)},unlock(e,o){return t.fetch("/me/talent-access/unlocks",{...o,method:"POST",body:e})},upgrade(e,o){return t.fetch("/me/talent-access/upgrade",{...o,method:"POST",body:e})}},alerts:{list(e){return t.fetch("/me/alerts",e)},create(e,o){return t.fetch("/me/alerts",{...o,method:"POST",body:e})},retrieve(e,o){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,o)},update(e,o,n){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,{...n,method:"PUT",body:o})},remove(e,o){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,{...o,method:"DELETE"})}},applications:{list(e,o){return t.fetch("/me/applications",{...o,query:e})},retrieve(e,o){return t.fetch(`/me/applications/${encodeURIComponent(e)}`,o)},updateFacts(e,o,n){return t.fetch(`/me/applications/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},withdraw(e,o){return t.fetch(`/me/applications/${encodeURIComponent(e)}/withdraw`,{...o,method:"POST"})}},resume:{upload(e,o,n){let r=new FormData;return r.append("resume",e),o?.keepResumeOnFile&&r.append("keepResumeOnFile","true"),o?.importMode&&r.append("importMode",o.importMode),o?.confirmReplaceAll&&r.append("confirmReplaceAll","true"),t.fetch("/me/resume",{...n,method:"POST",body:r})},retrieve(e){return t.fetch("/me/resume",e)},delete(e){return t.fetch("/me/resume",{...e,method:"DELETE"})}},recommendedJobs:{list(e,o){return t.fetch("/me/recommended-jobs",{...o,query:e})}},savedJobs:{list(e,o){return t.fetch("/me/saved-jobs",{...o,query:e})},save(e,o,n){return t.fetch("/me/saved-jobs",{...n,method:"POST",body:e,query:o})},unsave(e,o,n){return t.fetch(`/me/saved-jobs/${encodeURIComponent(e)}`,{...n,method:"DELETE",query:o})}},conversations:{list(e,o){return t.fetch("/me/conversations",{...o,query:e})},unreadCount(e){return t.fetch("/me/conversations/unread-count",e)},retrieve(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}`,o)},listMessages(e,o,n){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/messages`,{...n,query:o})},start(e,o){return t.fetch("/me/conversations",{...o,method:"POST",body:e})},startAboutApplication(e,o){return t.fetch("/me/conversations/about-application",{...o,method:"POST",body:e})},reply(e,o,n){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/reply`,{...n,method:"POST",body:o})},markRead(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/read`,{...o,method:"POST"})},archive(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/archive`,{...o,method:"POST"})},unarchive(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/unarchive`,{...o,method:"POST"})},findExisting(e,o){return t.fetch("/me/conversations/find-existing",{...o,query:e})}},blocks:{list(e){return t.fetch("/me/blocks",e)},create(e,o){return t.fetch("/me/blocks",{...o,method:"POST",body:e})},remove(e,o){return t.fetch(`/me/blocks/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},status(e,o){return t.fetch(`/me/blocks/${encodeURIComponent(e)}`,o)}},messages:{edit(e,o,n){return t.fetch(`/me/messages/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},unsend(e,o){return t.fetch(`/me/messages/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},report(e,o,n){return t.fetch(`/me/messages/${encodeURIComponent(e)}/report`,{...n,method:"POST",body:o})}},marketingConsent:{retrieve(e){return t.fetch("/me/marketing-consent",e)},grant(e){return t.fetch("/me/marketing-consent/grant",{...e,method:"POST"})},withdraw(e){return t.fetch("/me/marketing-consent/withdraw",{...e,method:"POST"})}},access:{checkout(e,o){return t.fetch("/me/access/checkout",{...o,method:"POST",body:e})},retrieveCheckout(e,o){return t.fetch(`/me/access/checkout/${encodeURIComponent(e)}`,o)},grant(e){return t.fetch("/me/access/grant",e)},portal(e,o){return t.fetch("/me/access/portal",{...o,method:"POST",body:e})}}}}function Me(t){return{async verify(e,o){let n=await t.fetch("/password/verify",{...o,method:"POST",body:{password:e}});return await t.storage.setItem(F,n.token),n}}}function Je(t){return{offers(e){return t.fetch("/paywall/offers/enabled",e)}}}function we(t){return{list(e,o){return t.fetch("/plans",{...o,query:e})},salesLed(e){return t.fetch("/sales-led-plans",e)}}}function Ne(t){return{resolve(e,o){return t.fetch("/redirects/resolve",{...o,query:{path:e}})}}}function $e(t){return{companies:{list(e){return t.fetch("/salaries/companies",e)}},titles:{list(e,o){return t.fetch("/salaries/titles",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}`,{...n,query:o})},locations(e,o,n){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}/locations`,{...n,query:o})},location(e,o,n,r){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}/${encodeURIComponent(o)}`,{...r,query:n})}},skills:{list(e,o){return t.fetch("/salaries/skills",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}`,{...n,query:o})},locations(e,o,n){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}/locations`,{...n,query:o})},location(e,o,n,r){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}/${encodeURIComponent(o)}`,{...r,query:n})}},locations:{list(e,o){return t.fetch("/salaries/locations",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}`,{...n,query:o})},titles(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}/titles`,{...n,query:o})},skills(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}/skills`,{...n,query:o})}}}}function De(t){return{suggest(e,o){return t.fetch("/search/suggest",{...o,query:e})}}}function je(t){return Object.assign(e=>t.fetch("/sitemap",e),{entries(e,o,n){return t.fetch(`/sitemap/${encodeURIComponent(e)}`,{...n,query:o})}})}function Qe(t){return{list(e,o){return t.fetch("/talent",{...o,query:e})},retrieve(e,o){return t.fetch(`/talent/${encodeURIComponent(e)}`,o)}}}function Ge(t,e){return{resolve(o,n){return t.fetch(`/${e}/${encodeURIComponent(o)}`,n)}}}function qe(t,e){return{...Ge(t,e),list(o,n){return t.fetch(`/${e}`,{...n,query:o})}}}function He(t){return{categories:qe(t,"categories"),skills:qe(t,"skills"),remotePermits:{list(e){return t.fetch("/remote-permits",e)}},places:{...Ge(t,"places"),list(e,o){return t.fetch("/places",{...o,query:e})}}}}function Ve(t,e,o){async function*n(){let r=e;for(;;){let i=await t(r,o);if(yield i,!i.hasMore||i.nextCursor===null)return;let{offset:a,...s}=r??{};r={...s,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 a of n())if(i.push(...a.data),i.length>=r)break;return i.slice(0,r)}}}function Ke(t,e){return t.authorBoardUserId!==e}function Ye(t,e){let o=t.some(r=>r.authorBoardUserId===e);return t.some(r=>r.authorBoardUserId!==e)&&!o}function We(t,e){for(let o=t.length-1;o>=0;o--){let n=t[o];if(n.authorBoardUserId!==e)return n.id}return null}function X(t){let e=t.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,"").replace(/[\t\n\r]/g,""),o=/^([a-z][a-z0-9+.-]*):/i.exec(e)?.[1]?.toLowerCase();return o===void 0?!0:o==="http"||o==="https"||o==="mailto"}function ee(t){let e=t.applicationUrl&&X(t.applicationUrl)?t.applicationUrl:null;return!e&&!t.jobSlug?{kind:"none"}:t.registrationWall&&!t.viewer?{kind:"sign-in",reason:"registration-wall"}:e?{kind:"external",url:e}:t.jobSlug?t.viewer?t.viewer.emailVerified?t.applied?{kind:"applied"}:{kind:"native",jobSlug:t.jobSlug}:{kind:"verify-email"}:t.allowGuestApply?{kind:"guest",jobSlug:t.jobSlug}:{kind:"sign-in",reason:"native-apply"}:{kind:"none"}}function ze(t){let e=ee({...t,registrationWall:!1,allowGuestApply:!1});return e.kind==="sign-in"?{kind:"sign-in"}:e}function eo(t){let e=new I({baseUrl:t.baseUrl??Re,board:t.board,storage:ve(t.auth?.storage,t.board),globalHeaders:t.globalHeaders,onRequest:t.onRequest,onResponse:t.onResponse,logger:t.logger});return{client:e,context(o){return e.fetch("",o)},seo(o){return e.fetch("/seo",o)},jobs:ke(e),embed:Fe(e),companies:Le(e),blog:Te(e),auth:_e(e),me:Ue(e),password:Me(e),taxonomy:He(e),search:De(e),redirects:Ne(e),jobAlerts:Ie(e),jobPosting:xe(e),salaries:$e(e),talent:Qe(e),plans:we(e),paywall:Je(e),sitemap:je(e)}}var te={};_(te,{DEFAULT_SORT:()=>to,EMPLOYMENT_TYPES:()=>Xe,JOB_SORTS:()=>tt,REMOTE_OPTIONS:()=>Ze,SENIORITIES:()=>et,parseCompany:()=>nt,parseListingFilters:()=>no,parseSeniority:()=>ot});var Ze=["on_site","hybrid","remote"],Xe=["full_time","part_time","contract","internship","temporary"],et=["entry_level","associate","mid_level","senior","lead","principal","director","executive"],tt=["relevance","newest","salary_high"],to="relevance";var oo=new Set(et);function ot(t){let e=Array.isArray(t)?t:typeof t=="string"&&t?t.split(","):[],o=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");!i||n.has(i)||oo.has(i)&&(n.add(i),o.push(i))}return o.length>0?o:void 0}function nt(t){let e=Array.isArray(t)?t:typeof t=="string"&&t?t.split(","):[],o=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");if(!(!i||n.has(i))&&(n.add(i),o.push(i),o.length>=10))break}return o.length>0?o:void 0}function no(t){return{q:typeof t.q=="string"&&t.q?t.q:void 0,remoteOption:Ze.includes(t.remoteOption)?t.remoteOption:void 0,employmentType:Xe.includes(t.employmentType)?t.employmentType:void 0,seniority:ot(t.seniority),company:nt(t.company),sort:tt.includes(t.sort)?t.sort:void 0}}var ce={};_(ce,{COUNTRY_CODES:()=>W,buildJobBreadcrumbs:()=>Y,countryOptions:()=>Ut,formatDate:()=>lt,formatMonthYear:()=>ct,formatPublishedRelativeDate:()=>pt,formatSalaryRange:()=>ut,formatSalaryStat:()=>j,formatSalaryStatRange:()=>x,normalizeWebsiteUrl:()=>U,resolveCustomFieldDisplay:()=>Mt});function S(t){let e=t.trim();if(!e)return null;try{let o=e.replace(/_/g,"-"),[n]=Intl.getCanonicalLocales(o);if(!n)return null;let[r]=Intl.NumberFormat.supportedLocalesOf([n]);return r??null}catch{return null}}var rt=new Map,it=new Map,at=new Map,st=new Map;function ro(t){let e=rt.get(t);return e||(e=new Intl.RelativeTimeFormat(t,{numeric:"always",style:"short"}),rt.set(t,e)),e}function io(t){let e=it.get(t);return e||(e=new Intl.RelativeTimeFormat(t,{numeric:"auto",style:"short"}),it.set(t,e)),e}function ao(t){let e=at.get(t);return e||(e=new Intl.DateTimeFormat(t,{dateStyle:"medium",timeZone:"UTC"}),at.set(t,e)),e}function so(t){let e=st.get(t);return e||(e=new Intl.DateTimeFormat(t,{month:"short",year:"numeric",timeZone:"UTC"}),st.set(t,e)),e}function oe(t,e,o){try{return ro(o).format(t,e)}catch{return null}}function lt(t,e){if(!e)return null;let o=new Date(e);if(Number.isNaN(o.getTime()))return null;let n=S(t);if(!n)return null;try{return ao(n).format(o)}catch{return o.toISOString().split("T")[0]}}function pt(t,e,o=Date.now()){if(!e)return null;let n=new Date(e);if(Number.isNaN(n.getTime()))return null;let r=S(t);if(!r)return null;let i=o-n.getTime(),a=Math.abs(i),s=60*1e3,p=60*s,l=24*p,u=7*l,d=30*l,m=365*l;if(a<s)try{return io(r).format(0,"second")}catch{return oe(0,"second",r)}let y=[{unit:"year",ms:m},{unit:"month",ms:d},{unit:"week",ms:u},{unit:"day",ms:l},{unit:"hour",ms:p},{unit:"minute",ms:s}];for(let f of y)if(a>=f.ms){let P=Math.round(a/f.ms),c=i>=0?-P:P;return oe(c,f.unit,r)}let g=Math.round(a/1e3),C=i>=0?-g:g;return oe(C,"second",r)}function ct(t,e){if(!e)return null;let n=/^\d{4}-\d{2}(-\d{2})?$/.test(e)?new Date(e.length===7?`${e}-01T00:00:00.000Z`:`${e}T00:00:00.000Z`):new Date(e);if(Number.isNaN(n.getTime()))return null;let r=S(t);if(!r)return null;try{return so(r).format(n)}catch{return null}}var $=new Map;function ne(t,e,o,n="symbol",r="compact"){let i=`${e}:${o}:${n}:${r}`,a=$.get(i);if(a===void 0){try{let s={style:"currency",currency:o,currencyDisplay:n,notation:r};r==="compact"&&(s.compactDisplay="short",s.maximumFractionDigits=1,s.minimumFractionDigits=0),a=new Intl.NumberFormat(e,s)}catch{a=null}$.set(i,a)}return a?a.format(t):null}function re(t,e,o){if(typeof t.formatRange=="function")try{return t.formatRange(e,o)}catch{}try{return`${t.format(e)}\u2013${t.format(o)}`}catch{return null}}function lo(t,e,o,n,r="symbol",i="compact"){let a=`${o}:${n}:${r}:${i}:range`,s=$.get(a);if(s===void 0){try{let p={style:"currency",currency:n,currencyDisplay:r,notation:i};i==="compact"&&(p.compactDisplay="short",p.maximumFractionDigits=1,p.minimumFractionDigits=0),s=new Intl.NumberFormat(o,p)}catch{s=null}$.set(a,s)}return s?re(s,t,e):null}var po=new Set(["per_year","per_month","per_week","per_day","per_hour"]);function co(...t){let e=!1;for(let o of t)if(!(o==null||!Number.isFinite(o))&&(e=!0,Math.abs(o)>=1e3))return"compact";return e?"standard":"compact"}function ut(t,e,o,n,r=null,i="symbol",a){let s=e==null||Number.isFinite(e),p=o==null||Number.isFinite(o);if(!s||!p||e==null&&o==null)return null;let l=r?.trim().toUpperCase()||null;if(!l)return null;let u=S(t);if(!u)return null;let d=a??co(e,o),m=typeof n=="string"&&po.has(n)?n:null;if(e!=null&&o!=null){let g=e<=o?e:o,C=e<=o?o:e,f=g===C?ne(g,u,l,i,d):lo(g,C,u,l,i,d);return f?{text:f,timeframe:m,bound:"range"}:null}if(e!=null){let g=ne(e,u,l,i,d);return g?{text:g,timeframe:m,bound:"from"}:null}let y=ne(o,u,l,i,d);return y?{text:y,timeframe:m,bound:"upTo"}:null}var mt=new Map;function dt(...t){let e=!1;for(let o of t)if(!(o==null||!Number.isFinite(o))&&(e=!0,Math.abs(o)>=1e3))return"compact";return e?"standard":"compact"}function yt(t,e,o){let n=`${t}:${e}:${o}`,r=mt.get(n);if(r!==void 0)return r;let i;try{let a={style:"currency",currency:e,notation:o};o==="compact"&&(a.compactDisplay="short",a.minimumFractionDigits=0,a.maximumFractionDigits=1),i=new Intl.NumberFormat(t,a)}catch{i=null}return mt.set(n,i),i}function j(t,e,o,n){if(!Number.isFinite(e))return null;let r=o?.trim().toUpperCase()||null;if(!r)return null;let i=S(t);if(!i)return null;let a=n??dt(e),s=yt(i,r,a);return s?s.format(e):null}function x(t,e,o,n,r){if(!Number.isFinite(e)||!Number.isFinite(o))return null;let i=n?.trim().toUpperCase()||null;if(!i)return null;let a=S(t);if(!a)return null;let s=r??dt(e,o),p=yt(a,i,s);if(!p)return null;let l=Math.min(e,o),u=Math.max(e,o);return l===u?p.format(l):re(p,l,u)}var D=["entry_level","associate","mid_level","senior","lead","principal","director","executive"];function gt(t){return[...t].sort((e,o)=>{let n=D.indexOf(e.seniority),r=D.indexOf(o.seniority);return(n===-1?999:n)-(r===-1?999:r)})}var uo={unitText:"YEAR",duration:"P1Y"};function k(t,e,o,n,r={}){return{"@type":"MonetaryAmountDistribution",...t!==void 0?{name:t}:{},currency:e,minValue:o,maxValue:n,...r,...uo}}function ie(t,e,o,n){return t.map(r=>{let i=n?.seniorityName?.({seniority:r.seniority,entity:o});return k(i,e,r.avgSalaryMin,r.avgSalaryMax)})}function Q(t,e,o,n){return{"@context":"https://schema.org","@type":t,name:e,...o,estimatedSalary:n}}function ft(t,e,o,n){if(!o)return[];let r=x(t,o.avgMin,o.avgMax,n);return[{kind:"average",label:e,range:r,avgMin:o.avgMin,avgMax:o.avgMax,currency:n,jobCount:o.jobCount},{kind:"methodology",label:e}]}function q(t){return t.length===0?null:{"@context":"https://schema.org","@type":"ItemList",numberOfItems:t.length,itemListElement:t.map((e,o)=>({"@type":"ListItem",position:o+1,name:e.name,url:e.url}))}}function ht(t){return t.length===0?null:{"@context":"https://schema.org","@type":"FAQPage",mainEntity:t.map(e=>({"@type":"Question",name:e.q,acceptedAnswer:{"@type":"Answer",text:e.a}}))}}function bt(t,e){return t.overallSalary?Q("Occupation",t.categoryName,{},[k(t.categoryName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{...t.boardP25Min?{percentile25:t.boardP25Min}:{},...t.boardP75Max?{percentile75:t.boardP75Max}:{}}),...ie(t.bySeniority,t.currency,t.categoryName,e)]):null}function St(t){return t.overallSalary?Q("Occupation",t.skillName,{},[k(t.skillName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{median:Math.round((t.overallSalary.medianMin+t.overallSalary.medianMax)/2)})]):null}function Ct(t,e){return!e?.occupationUrl||!(t.adminLevel==="city"||t.adminLevel==="locality")?null:q(t.topCategories.map(n=>({name:n.categoryName,url:e.occupationUrl(n)})))}function Ot(t,e){return t.overall?Q("Occupation",t.name,{occupationLocation:{"@type":"AdministrativeArea",name:t.placeName,address:{"@type":"PostalAddress",addressCountry:t.countryCode}}},[k(t.name,t.currency,t.overall.avgMin,t.overall.avgMax,{...t.overall.p25Min?{percentile25:t.overall.p25Min}:{},...t.overall.p75Max?{percentile75:t.overall.p75Max}:{}}),...ie(t.bySeniority,t.currency,t.name,e)]):null}function Et(t,e){return e?.occupationUrl?q(t.byCategory.map(o=>({name:o.categoryName,url:e.occupationUrl(o)}))):null}function Bt(t,e){return t.overallSalary?Q("Occupation",t.categoryName,{occupationalCategory:t.categoryName,hiringOrganization:{"@type":"Organization",name:t.companyName}},[k(t.categoryName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{...t.boardCategoryP25Min?{percentile25:t.boardCategoryP25Min}:{},...t.boardCategoryP75Max?{percentile75:t.boardCategoryP75Max}:{}}),...ie(t.bySeniority,t.currency,t.categoryName,e)]):null}function At(t,e){return t.company?.name??e.legalName??e.contact?.legalName??e.name??null}var Pt={high_school:"high school",associate_degree:"associate degree",bachelor_degree:"bachelor degree",professional_certificate:"professional certificate",postgraduate_degree:"postgraduate degree"},mo={full_time:"FULL_TIME",part_time:"PART_TIME",contract:"CONTRACTOR",internship:"INTERN",temporary:"TEMPORARY",volunteer:"VOLUNTEER",other:"OTHER"},yo={per_year:"YEAR",per_month:"MONTH",per_week:"WEEK",per_day:"DAY",per_hour:"HOUR"},se=["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 Rt({job:t,board:e,shareUrl:o}){let n=Oo(t),r=Eo(t),i=ae({"@context":"https://schema.org/","@type":"JobPosting",title:t.title,description:t.description??"",identifier:go(t,e),datePosted:vt(t.publishedAt),validThrough:vt(t.expiresAt),employmentType:t.employmentType?mo[t.employmentType]??"OTHER":"OTHER",hiringOrganization:fo(t,e),jobLocation:bo(t),jobLocationType:t.remoteOption==="remote"?"TELECOMMUTE":void 0,applicantLocationRequirements:t.remoteOption==="remote"?Co(t):null,baseSalary:ho(t),educationRequirements:n,experienceRequirements:r,experienceInPlaceOfEducation:t.experienceInPlaceOfEducation===!0&&n&&r?!0:void 0,url:o});return!i||Array.isArray(i)||Object.keys(i).length===0?null:i}function go(t,e){let o=At(t,e),n={"@type":"PropertyValue",value:t.id};return o&&(n.name=o),n}function fo(t,e){let o=At(t,e);if(!o)return null;let n={"@type":"Organization",name:o},r=t.company?.website??null,i=r?U(r):null;i&&(n.sameAs=i);let a=t.company?.logoUrl??e.logoUrl??null;return a&&(n.logo=a),n}function U(t){let e=t.trim();return e?/^https?:\/\//i.test(e)?e:`https://${e}`:null}function ho(t){let e=t.salaryCurrency?.trim(),o=typeof t.salaryMin=="number",n=typeof t.salaryMax=="number";if(!e||!o&&!n)return null;let r={"@type":"QuantitativeValue"};o&&(r.minValue=t.salaryMin),n&&(r.maxValue=t.salaryMax);let i=t.salaryTimeframe?yo[t.salaryTimeframe]:void 0;return i&&(r.unitText=i),!o&&n&&typeof t.salaryMax=="number"?(r.value=t.salaryMax,r.minValue=t.salaryMax):!n&&o&&typeof t.salaryMin=="number"&&(r.value=t.salaryMin,r.maxValue=t.salaryMin),{"@type":"MonetaryAmount",currency:e.toUpperCase(),value:r}}function bo(t){let e=t.officeLocations.map(o=>So({countryCode:o.countryCode,region:o.region,locality:o.city??o.locality,postalCode:o.postalCode,name:o.displayName})).filter(o=>o!==null);return e.length===0?null:e.length===1?e[0]:e}function So({countryCode:t,region:e,locality:o,postalCode:n,name:r}){let i={"@type":"PostalAddress"},a=t?.trim(),s=e?.trim(),p=o?.trim(),l=n?.trim(),u=r?.trim();a&&(i.addressCountry=a.toUpperCase()),s&&(i.addressRegion=s),p&&(i.addressLocality=p),l&&(i.postalCode=l);let d=Object.keys(i).length>1;if(!d&&!u)return null;let m={"@type":"Place"};return u&&(m.name=u),d&&(m.address=i),m}function Co(t){if(t.remoteWorldwide)return se.map(n=>({"@type":"Country",name:n}));let e=[],o=new Set;for(let n of t.remoteWorkPermitCountryCodes??[]){let r=n?.trim().toUpperCase();!r||o.has(r)||(o.add(r),e.push({"@type":"Country",name:r}))}for(let n of t.remoteWorkPermitSubdivisionCodes??[]){let r=n?.split("-")[0]?.trim().toUpperCase();!r||o.has(r)||(o.add(r),e.push({"@type":"Country",name:r}))}return e.length===0?null:e.length===1?e[0]:e}function Oo(t){let e=t.educationRequirements;if(!e||e.length===0)return null;if(e.includes("no_requirements"))return"no requirements";let o=e.filter(n=>n in Pt).map(n=>({"@type":"EducationalOccupationalCredential",credentialCategory:Pt[n]}));return o.length>0?o:null}function Eo(t){let e=t.experienceMonths;return typeof e!="number"?null:e===0?"no requirements":{"@type":"OccupationalExperienceRequirements",monthsOfExperience:e}}function vt(t){if(!t)return null;let e=new Date(t);return Number.isNaN(e.getTime())?null:e.toISOString()}function ae(t){let e=o=>o==null?!1:Array.isArray(o)?o.length>0:typeof o=="object"?Object.keys(o).length>0:!0;if(Array.isArray(t))return t.map(o=>ae(o)).filter(e);if(t&&typeof t=="object"){let o=Object.entries(t).map(([n,r])=>[n,ae(r)]).filter(([,n])=>e(n));return Object.fromEntries(o)}return t}var pe={};_(pe,{BOARD_PATHS:()=>V,blogAuthorPath:()=>_o,blogPostPath:()=>It,blogTagPath:()=>xt,boardUrl:()=>K,companyMarketPath:()=>Ft,companyPath:()=>Lt,companySalaryPath:()=>Po,encodePathSegment:()=>h,goAlertsConfirmPath:()=>Fo,goAlertsManagePath:()=>Lo,goJobPath:()=>To,jobDetailPath:()=>le,jobsCategoryPath:()=>G,jobsLocationCategoryPath:()=>H,jobsLocationPath:()=>M,jobsLocationSkillPath:()=>Tt,jobsSkillPath:()=>_t,salaryLocationPath:()=>Ro,salarySkillPath:()=>Ao,salaryTitlePath:()=>vo,suggestionPath:()=>Bo});function h(t){try{return encodeURIComponent(decodeURIComponent(t)).replace(/%3A/gi,":")}catch{return encodeURIComponent(t).replace(/%3A/gi,":")}}function le(t,e){return`/companies/${h(t)}/jobs/${h(e)}`}function G(t){return`/jobs/${h(t)}`}function _t(t){return`/jobs/skills/${h(t)}`}function M(t){return`/jobs/locations/${h(t)}`}function H(t,e){return`${M(t)}/${h(e)}`}function Tt(t,e){return`${M(t)}/skills/${h(e)}`}function Lt(t){return`/companies/${h(t)}`}function Ft(t){return`/companies/markets/${h(t)}`}function Bo(t,e){let o=e.location?.trim()||void 0;return e.scope==="blog"?t.type==="post"?It(t.slug):t.type==="tag"?xt(t.slug):null:e.scope==="jobs"?t.type==="company"||t.type==="market"||t.type==="post"||t.type==="tag"?null:t.termType==="skill"?o?Tt(o,t.canonicalSlug):_t(t.canonicalSlug):o?H(o,t.canonicalSlug):G(t.canonicalSlug):t.type==="company"?Lt(t.slug):t.type==="market"?Ft(t.slug):null}function Po(t){return`/companies/${h(t)}/salaries`}function vo(t){return`/salaries/titles/${h(t)}`}function Ao(t){return`/salaries/skills/${h(t)}`}function Ro(t){return`/salaries/locations/${h(t)}`}function It(t){return`/blog/${h(t)}`}function xt(t){return`/blog/tag/${h(t)}`}function _o(t){return`/blog/author/${h(t)}`}var V={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 To(t){return`/go/job/${t}`}function Lo(){return"/go/alerts-manage"}function Fo(){return"/go/alerts-confirm"}function K(t,e){return`${t.replace(/\/+$/,"")}${e}`}function kt(t,e={}){let o=t.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 a=r.href?Io(r.href,e.origin??null):null,s={"@type":"ListItem",position:i+1,name:r.name};return a&&(s.item=a),s})}}function Io(t,e){if(xo(t))return t;if(!e)return null;let o=t.startsWith("/")?t:`/${t}`;return`${e}${o}`}function xo(t){return/^https?:\/\//i.test(t)}function Y(t){let e=[{kind:"home",path:V.home},{kind:"jobs",path:V.jobs}],o=null;for(let r of t.placeHierarchy)o=r.slug,e.push({kind:"place",name:r.name,path:M(r.slug)});let n=t.categories[0];return n&&e.push({kind:"category",name:n.name,path:o?H(o,n.slug):G(n.slug)}),e.push({kind:"job",name:t.title}),e}var W=["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 ko(t){try{return new Intl.DisplayNames([t],{type:"region"})}catch{return null}}function Uo(t){try{return new Intl.Collator(t)}catch{return new Intl.Collator}}function Ut(t){let e=S(t);if(!e)return W.map(r=>({code:r,name:r})).sort((r,i)=>r.code<i.code?-1:r.code>i.code?1:0);let o=ko(e),n=Uo(e).compare;return W.map(r=>({code:r,name:o?.of(r)??r})).sort((r,i)=>n(r.name,i.name))}function Mo(t,e){if(!Array.isArray(e)||e.length===0)return null;let o=e.map(n=>t.options?.find(r=>r.key===n)?.label).filter(n=>!!n);return o.length>0?o:null}function Jo(t,e){switch(t.type){case"number":return null;case"multi_select":return null;case"single_select":return typeof e!="string"?null:t.options?.find(o=>o.key===e)?.label??null;default:return typeof e=="string"&&e.trim()!==""?e:null}}function Mt(t,e,o){let n=[];for(let r of e??[]){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 s=Mo(r,i);s&&n.push({key:r.key,label:r.label,kind:"multi_select",values:s});continue}let a=Jo(r,i);a!==null&&n.push({key:r.key,label:r.label,kind:"text",value:a})}return n}var ue={};_(ue,{ALL_COUNTRY_CODES:()=>se,SENIORITY_ORDER:()=>D,buildJobBreadcrumbs:()=>Y,buildSalaryFaq:()=>ft,companyCategorySalaryJsonLd:()=>Bt,companySalaryJsonLd:()=>Et,createAuthorProfileJsonLd:()=>wt,createBlogArticleJsonLd:()=>Jt,createBreadcrumbJsonLd:()=>kt,createJobPostingJsonLd:()=>Rt,crossAxisSalaryJsonLd:()=>Ot,faqJsonLd:()=>ht,formatSalaryStat:()=>j,formatSalaryStatRange:()=>x,itemListJsonLd:()=>q,listingHead:()=>Nt,listingJsonLd:()=>$t,locationSalaryJsonLd:()=>Ct,normalizeWebsiteUrl:()=>U,skillSalaryJsonLd:()=>St,sortBySeniority:()=>gt,titleSalaryJsonLd:()=>bt});function Jt({post:t,boardName:e,permalink:o,ogImageUrl:n}){let r={"@context":"https://schema.org","@type":"Article",headline:t.title,url:o,mainEntityOfPage:{"@type":"WebPage","@id":o},publisher:{"@type":"Organization",name:e}};t.customExcerpt&&(r.description=t.customExcerpt),t.publishedAt&&(r.datePublished=t.publishedAt);let i=t.coverUrl??n;i&&(r.image=i);let a=t.authors[0];return a&&(r.author={"@type":"Person",name:a.name,...a.websiteUrl?{url:a.websiteUrl}:{}}),r}function wt({author:t,canonical:e,description:o,origin:n,posts:r,totalPosts:i}){if(!t.name)return null;let a=o.trim(),s=[z(t.websiteUrl),z(t.twitterUrl),z(t.linkedinUrl),z(t.githubUrl)].filter(m=>!!m),p=`${e}#profile`,l=r.slice(0,5).map(m=>{let y=wo(n,`/blog/${m.slug}`);return y?{"@type":"Article",headline:m.title,url:y,datePublished:m.publishedAt,author:{"@id":p}}:null}).filter(m=>m!==null),u=i>0?{"@type":"InteractionCounter",interactionType:"https://schema.org/WriteAction",userInteractionCount:i}:void 0,d={"@context":"https://schema.org","@type":"ProfilePage",url:e,mainEntity:{"@type":"Person","@id":p,name:t.name,alternateName:t.slug??void 0,identifier:t.id??void 0,description:a||void 0,image:t.avatarUrl??void 0,sameAs:s.length>0?s:void 0,url:e,mainEntityOfPage:e,agentInteractionStatistic:u}};return l.length>0&&(d.hasPart=l),d}function z(t){if(!t)return null;let e=t.trim();if(!e)return null;try{let o=e.startsWith("http://")||e.startsWith("https://")?e:`https://${e}`;return new URL(o).toString()}catch{return null}}function wo(t,e){if(!t||!e)return null;try{return new URL(e,t).toString()}catch{return null}}function Nt(t){let e=t.title,o=t.description,n=`${t.origin}${t.path}`;return{meta:[{title:e},{name:"description",content:o},{property:"og:title",content:e},{property:"og:description",content:o},{property:"og:type",content:"website"},{property:"og:url",content:n}],links:[{rel:"canonical",href:n}]}}function $t(t){let e=[];t.breadcrumbs.length>=2&&e.push({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:t.breadcrumbs.map((n,r)=>({"@type":"ListItem",position:r+1,name:n.name,...n.path?{item:K(t.origin,n.path)}:{}}))});let o=(t.jobs??[]).filter(n=>n.company!=null&&!!n.company.slug);return o.length>0&&e.push({"@context":"https://schema.org","@type":"ItemList",itemListElement:o.map((n,r)=>({"@type":"ListItem",position:r+1,url:K(t.origin,le(n.company.slug,n.slug))}))}),e}var me={};_(me,{createSuggestController:()=>Do});function No(t){return typeof DOMException<"u"&&t instanceof DOMException&&t.name==="AbortError"||t instanceof Error&&t.name==="AbortError"}function $o(t){try{let e=0;for(let o of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(t))e+=1;return e}catch{return[...t].length}}function Dt(t,e){return e.size===0?t.slice():t.filter(o=>!(o.type==="company"&&e.has(o.slug.toLowerCase().normalize("NFC"))))}function Do(t,e){let o=e?.minChars??2,n=e?.debounceMs??250,r=e?.limit,i=!1,a={query:"",items:[],status:"idle",error:null},s=[],p=new Set,l=0,u=null,d=null,m=new Set;function y(){for(let c of m)c()}function g(c){a=c,y()}function C(){u!==null&&(globalThis.clearTimeout(u),u=null)}function f(){d&&(d.abort(),d=null)}function P(c){let b=++l;f();let O=new AbortController;d=O;let R={q:c};r!==void 0&&(R.limit=r),t.search.suggest(R,{signal:O.signal}).then(v=>{i||b!==l||(d=null,s=v.items,g({query:a.query,items:Dt(s,p),status:"ready",error:null}))}).catch(v=>{i||b!==l||No(v)||(d=null,g({query:a.query,items:a.items,status:"error",error:v}))})}return{setQuery(c){if(i)return;let b=c.trim();if(C(),$o(b)<o){l+=1,f(),s=[],g({query:c,items:[],status:"idle",error:null});return}l+=1,f(),g({query:c,items:a.items,status:"loading",error:null}),u=globalThis.setTimeout(()=>{u=null,!i&&P(b)},n)},setExcludedCompanySlugs(c){i||(p=new Set(c.map(b=>b.trim().toLowerCase().normalize("NFC")).filter(Boolean)),g({query:a.query,items:Dt(s,p),status:a.status,error:a.error}))},getState(){return a},subscribe(c){return i?()=>{}:(m.add(c),()=>{m.delete(c)})},dispose(){i||(i=!0,C(),f(),l+=1,m.clear())}}}return Vt(jo);})();
|
|
1
|
+
"use strict";var CavunoBoard=(()=>{var J=Object.defineProperty;var jt=Object.getOwnPropertyDescriptor;var Qt=Object.getOwnPropertyNames;var qt=Object.prototype.hasOwnProperty;var Gt=(t,e,o)=>e in t?J(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var _=(t,e)=>{for(var o in e)J(t,o,{get:e[o],enumerable:!0})},Ht=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Qt(e))!qt.call(t,r)&&r!==o&&J(t,r,{get:()=>e[r],enumerable:!(n=jt(e,r))||n.enumerable});return t};var Vt=t=>Ht(J({},"__esModule",{value:!0}),t);var E=(t,e,o)=>Gt(t,typeof e!="symbol"?e+"":e,o);var jo={};_(jo,{ACCESS_TOKEN_KEY:()=>T,BOARD_ACCESS_GRANT_KEY:()=>F,BOARD_API_ERROR_CODES:()=>de,BoardApiError:()=>A,BoardClient:()=>I,REFRESH_TOKEN_KEY:()=>L,SDK_VERSION:()=>N,createBoardClient:()=>eo,filters:()=>te,format:()=>ce,isBoardApiError:()=>B,isBoardPasswordRequired:()=>fe,isColdRule:()=>Ye,isConflict:()=>Ce,isForbidden:()=>he,isFreeEmailWebsiteError:()=>Oe,isNotFound:()=>ye,isOwnMessage:()=>Ke,isRateLimited:()=>Se,isSafeApplicationUrl:()=>X,isUnauthorized:()=>ge,isValidationError:()=>be,lastOwnMessageId:()=>We,paginate:()=>Ve,paths:()=>pe,resolveApplyAction:()=>ze,resolveApplyDecision:()=>ee,seo:()=>ue,suggest:()=>me});var de=["internal_error","validation_bad_request","validation_payload_too_large","rate_limited","rate_limit_unavailable","search_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","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","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","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","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"],A=class extends Error{constructor(o){super(o.message);E(this,"status");E(this,"code");E(this,"details");E(this,"requestId");E(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 B(t){return t instanceof Error&&t.name==="BoardApiError"&&typeof t.status=="number"&&typeof t.code=="string"}function ye(t){return B(t)&&t.status===404}function ge(t){return B(t)&&t.status===401}function fe(t){return B(t)&&t.status===401&&t.code==="board_password_required"}function he(t){return B(t)&&t.status===403}function be(t){return B(t)&&t.status===400&&t.code==="validation_bad_request"}function Se(t){return B(t)&&t.status===429}function Ce(t){return B(t)&&t.status===409}function Oe(t){return B(t)&&t.status===422&&t.code==="employer_free_email_website"}function Ee(t){let e=new URLSearchParams;if(!t)return e;for(let[o,n]of Object.entries(t))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&e.append(o,String(r));else e.append(o,String(n));return e}function Be(t){let e=5381;for(let n=0;n<t.length;n++)e=(e<<5)+e+t.charCodeAt(n)>>>0;return`${t.replace(/[^a-zA-Z0-9_-]/g,"_")}-${e.toString(36)}`}var T="cavuno_board_access_token",L="cavuno_board_refresh_token",F="cavuno_board_access_grant";function Pe(){return typeof globalThis.document<"u"}function Kt(){let t=new Map;return{getItem:e=>t.get(e)??null,setItem:(e,o)=>{t.set(e,o)},removeItem:e=>{t.delete(e)}}}function Yt(t,e){if(!Pe())throw new Error(`storage mode '${t}' is browser-only \u2014 use 'nostore' + per-call headers on the server`);let o;try{if(o=t==="local"?globalThis.localStorage:globalThis.sessionStorage,!o)throw new Error("unavailable")}catch{throw new Error(`storage mode '${t}' 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=e?`:${Be(e)}`:"";return{getItem:r=>o.getItem(`${r}${n}`),setItem:(r,i)=>{o.setItem(`${r}${n}`,i)},removeItem:r=>{o.removeItem(`${r}${n}`)}}}var Wt=Symbol.for("@cavuno/board:nostore");var zt={[Wt]:!0,getItem:()=>null,setItem:()=>{},removeItem:()=>{}};function ve(t,e){let o=t??(Pe()?"memory":"nostore");if(typeof o=="object")return o;switch(o){case"memory":return Kt();case"nostore":return zt;case"local":case"session":return Yt(o,e);default:throw new Error(`Unknown storage mode '${String(o)}'`)}}async function w(t,e){await t.setItem(T,e.accessToken),await t.setItem(L,e.refreshToken)}async function Ae(t){await t.removeItem(T),await t.removeItem(L)}var N="4.23.0";function Zt(t){return typeof t=="string"||t instanceof URLSearchParams||typeof FormData<"u"&&t instanceof FormData||typeof Blob<"u"&&t instanceof Blob||t instanceof ArrayBuffer||typeof ReadableStream<"u"&&t instanceof ReadableStream}function Xt(t){try{let e=new URL(t);for(let o of new Set(e.searchParams.keys()))e.searchParams.delete(o),e.searchParams.set(o,"[REDACTED]");return e.toString()}catch{return t.replace(/([?&][^=&#]+)=([^&#]*)/g,"$1=[REDACTED]")}}var I=class{constructor(e){E(this,"storage");E(this,"basePath");E(this,"options");this.options=e,this.storage=e.storage;let o=e.baseUrl.replace(/\/+$/,"");this.basePath=`${o}/v1/boards/${encodeURIComponent(e.board)}`}async fetch(e,o={}){let{body:n,query:r,headers:i,...a}=o,s=(o.method??"GET").toUpperCase(),p=`${this.basePath}${e}`,u=Ee(r).toString();u&&(p+=`?${u}`);let d=n!==void 0&&!Zt(n),m=n===void 0?void 0:d?JSON.stringify(n):n,y=new Headers({accept:"application/json"});d&&y.set("content-type","application/json");for(let[v,Z]of Object.entries(this.options.globalHeaders??{}))y.set(v,Z);let g=await this.storage.getItem(T);g!==null&&y.set("authorization",`Bearer ${g}`);let C=await this.storage.getItem(F);C!==null&&y.set("x-board-access",C),i&&new Headers(i).forEach((v,Z)=>{y.set(Z,v)}),(s!=="GET"||y.has("authorization")||y.has("x-board-access"))&&!y.has("x-cavuno-sdk")&&y.set("x-cavuno-sdk",`board@${N}`);let f={url:p,init:{...a,method:s,headers:y,body:m}};this.options.onRequest&&(f=await this.options.onRequest(f));let P=Xt(f.url);this.options.logger?.debug(`${s} ${P}`);let c=await globalThis.fetch(f.url,f.init);if(this.options.logger?.debug(`${c.status} ${s} ${P}`),this.options.onResponse&&await this.options.onResponse(c.clone(),f),c.status===204)return;if(c.ok)return await c.json();let b;try{b=await c.json()}catch{b=void 0}let O=b?.error,R=O&&typeof O.code=="string"&&typeof O.message=="string"?new A({status:c.status,code:O.code,message:O.message,details:O.details,requestId:O.requestId,raw:b}):new A({status:c.status,code:"unknown_error",message:c.statusText||"Request failed",raw:b});throw this.options.logger?.error(`${R.status} ${R.code} ${s} ${P}`),R}};var Re="https://api.cavuno.com";function _e(t){async function e(n){return await w(t.storage,n),n}async function o(n){if(n?.refreshToken)return n.refreshToken;let r=await t.storage.getItem(L);if(r===null)throw new Error("No refresh token available \u2014 pass { refreshToken } or configure auth.storage");return r}return{async register(n,r){let i=await t.fetch("/auth/register",{...r,method:"POST",body:n});return e(i)},async login(n,r){let i=await t.fetch("/auth/login",{...r,method:"POST",body:n});return e(i)},async refresh(n,r){let i=await o(n),a=await t.fetch("/auth/refresh",{...r,method:"POST",body:{refreshToken:i}});return e(a)},async logout(n,r){let i=await o(n);await t.fetch("/auth/logout",{...r,method:"POST",body:{refreshToken:i}}),await Ae(t.storage)},verifyEmail(n,r){return t.fetch("/auth/verify-email",{...r,method:"POST",body:n})},verifyWorkEmail(n,r){return t.fetch("/auth/verify-work-email",{...r,method:"POST",body:n})},verifyEmailWithCode(n,r){return t.fetch("/auth/verify-email/otp",{...r,method:"POST",body:n})},resendVerification(n){return t.fetch("/auth/verify-email/resend",{...n,method:"POST"})},forgotPassword(n,r){return t.fetch("/auth/forgot-password",{...r,method:"POST",body:n})},resetPassword(n,r){return t.fetch("/auth/reset-password",{...r,method:"POST",body:n})},requestMagicLink(n,r){return t.fetch("/auth/magic-link",{...r,method:"POST",body:n})},async consumeMagicLink(n,r){let i=await t.fetch("/auth/magic-link/consume",{...r,method:"POST",body:n});return e(i)},getOAuthAuthorizationUrl(n,r,i){return t.fetch(`/auth/oauth/${n}`,{...i,method:"GET",query:r})},async exchangeOAuth(n,r){let i=await t.fetch("/auth/oauth/exchange",{...r,method:"POST",body:n});return e(i)}}}function Te(t){return{posts:{list(e,o){return t.fetch("/blog/posts",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/posts/${encodeURIComponent(e)}`,{...n,query:o})},adjacent(e,o){return t.fetch(`/blog/posts/${encodeURIComponent(e)}/adjacent`,o)},similar(e,o,n){return t.fetch(`/blog/posts/${encodeURIComponent(e)}/similar`,{...n,query:o})}},tags:{list(e,o){return t.fetch("/blog/tags",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/tags/${encodeURIComponent(e)}`,{...n,query:o})}},authors:{list(e,o){return t.fetch("/blog/authors",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/blog/authors/${encodeURIComponent(e)}`,{...n,query:o})}},search(e,o,n){return t.fetch("/blog/search",{...n,method:"POST",body:e,query:o})}}}function Le(t){let e=Object.assign((n,r)=>t.fetch("/companies/markets",{...r,query:n}),{resolve(n,r){return t.fetch(`/companies/markets/${encodeURIComponent(n)}`,r)}}),o=Object.assign((n,r)=>t.fetch(`/companies/${encodeURIComponent(n)}/salaries`,r),{summary(n,r){return t.fetch(`/companies/${encodeURIComponent(n)}/salaries/summary`,r)},category(n,r,i,a){return t.fetch(`/companies/${encodeURIComponent(n)}/salaries/${encodeURIComponent(r)}`,{...a,query:i})}});return{list(n,r){return t.fetch("/companies",{...r,query:n})},retrieve(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}`,{...i,query:r})},search(n,r,i){return t.fetch("/companies/search",{...i,method:"POST",body:n,query:r})},listJobs(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}/jobs`,{...i,query:r})},similar(n,r,i){return t.fetch(`/companies/${encodeURIComponent(n)}/similar`,{...i,query:r})},markets:e,salaries:o}}function Fe(t){return{jobs(e,o){return t.fetch("/embed/jobs",{...o,query:e})}}}function Ie(t){return{subscribe(e,o){return t.fetch("/job-alerts",{...o,method:"POST",body:e})},confirm(e,o){return t.fetch("/job-alerts/confirm",{...o,method:"POST",body:e})},resendConfirmation(e,o){return t.fetch("/job-alerts/resend-confirmation",{...o,method:"POST",body:e})},manage(e,o){return t.fetch("/job-alerts/manage",{...o,query:e})},unsubscribe(e,o){return t.fetch("/job-alerts/unsubscribe",{...o,method:"POST",body:e})},resubscribe(e,o){return t.fetch("/job-alerts/resubscribe",{...o,method:"POST",body:e})},updatePreference(e,o){return t.fetch("/job-alerts/preferences",{...o,method:"POST",body:e})},deletePreference(e,o){return t.fetch("/job-alerts/preferences",{...o,method:"DELETE",body:e})}}}function xe(t){return{plans(e,o){return t.fetch("/job-postings/plans",{...o,query:e})},create(e,o){return t.fetch("/job-postings",{...o,method:"POST",body:e})},uploadLogo(e,o){let n=new FormData;return n.append("file",e),t.fetch("/job-postings/logo",{...o,method:"POST",body:n})},fetchLogoByDomain(e,o){return t.fetch("/job-postings/logo/fetch",{...o,query:{domain:e}})},sendBillingVerification(e,o){return t.fetch("/job-postings/send-verification",{...o,method:"POST",body:e})},getBillingOptions(e,o){return t.fetch("/job-postings/billing-options",{...o,method:"POST",body:e})}}}function ke(t){return{list(e,o){return t.fetch("/jobs",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}`,{...n,query:o})},search(e,o,n){return t.fetch("/jobs/search",{...n,method:"POST",body:e,query:o})},similar(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/similar`,{...n,query:o})},apply(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply`,{...n,method:"POST",body:o??{}})},createApplyIntent(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply-intents`,{...n,method:"POST",body:o})},prepareApplyApproval(e,o,n){return t.fetch(`/jobs/${encodeURIComponent(e)}/apply-approvals`,{...n,method:"POST",body:o})},uploadApplicationResume(e,o,n,r){let i=new FormData;return i.append("file",o),n?.applicationId&&i.append("applicationId",n.applicationId),t.fetch(`/jobs/${encodeURIComponent(e)}/apply/resume`,{...r,method:"POST",body:i})},myApplication(e,o){return t.fetch(`/jobs/${encodeURIComponent(e)}/application`,o)}}}function Ue(t){return{retrieve(e,o){return t.fetch("/me",{...o,query:e})},delete(e){return t.fetch("/me",{...e,method:"DELETE"})},async updatePassword(e,o){let n=await t.fetch("/me/password",{...o,method:"POST",body:e});return await w(t.storage,n),n},requestEmailChange(e,o){return t.fetch("/me/email",{...o,method:"POST",body:e})},confirmEmailChange(e,o){return t.fetch("/me/email/confirm",{...o,method:"POST",body:e})},acceptInvite(e,o){return t.fetch("/me/invites/accept",{...o,method:"POST",body:e})},profile:{retrieve(e,o){return t.fetch("/me/profile",{...o,query:e})},update(e,o,n){return t.fetch("/me/profile",{...n,method:"PATCH",body:e,query:o})},handleAvailable(e,o){return t.fetch("/me/profile/handle-available",{...o,query:{handle:e}})},listExperience(e){return t.fetch("/me/profile/experience",e)},createExperience(e,o){return t.fetch("/me/profile/experience",{...o,method:"POST",body:e})},updateExperience(e,o,n){return t.fetch(`/me/profile/experience/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},deleteExperience(e,o){return t.fetch(`/me/profile/experience/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listEducation(e){return t.fetch("/me/profile/education",e)},createEducation(e,o){return t.fetch("/me/profile/education",{...o,method:"POST",body:e})},updateEducation(e,o,n){return t.fetch(`/me/profile/education/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},deleteEducation(e,o){return t.fetch(`/me/profile/education/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listSkills(e){return t.fetch("/me/profile/skills",e)},updateSkills(e,o){return t.fetch("/me/profile/skills",{...o,method:"PUT",body:e})},listLanguages(e){return t.fetch("/me/profile/languages",e)},updateLanguages(e,o){return t.fetch("/me/profile/languages",{...o,method:"PUT",body:e})},uploadAvatar(e,o){let n=new FormData;return n.append("file",e),t.fetch("/me/profile/avatar",{...o,method:"POST",body:n})}},notificationPreferences:{retrieve(e){return t.fetch("/me/notification-preferences",e)},update(e,o){return t.fetch("/me/notification-preferences",{...o,method:"PUT",body:e})},unsubscribeWithToken(e,o){return t.fetch("/me/notification-preferences/unsubscribe",{...o,method:"POST",body:e})}},companies:{search(e,o){return t.fetch("/me/companies/search",{...o,query:e})},list(e){return t.fetch("/me/companies",e)},create(e,o){return t.fetch("/me/companies",{...o,method:"POST",body:e})},claim(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/claim`,{...o,method:"POST"})},cancelClaim(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/claim`,{...o,method:"DELETE"})},retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,o)},update(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},delete(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},listMembers(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members`,o)},updateMemberRole(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},removeMember(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/members/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},leave(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership`,{...o,method:"DELETE"})},startMembershipCheckout(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership/checkout`,{...n,method:"POST",body:o})},retrieveMembershipCheckout(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/membership/checkout/${encodeURIComponent(o)}`,n)},listInvites(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites`,o)},createInvite(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites`,{...n,method:"POST",body:o})},revokeInvite(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/invites/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},uploadLogo(e,o,n){let r=new FormData;return r.append("file",o),t.fetch(`/me/companies/${encodeURIComponent(e)}/logo`,{...n,method:"POST",body:r})},workEmail:{verify(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/work-email/verify`,{...n,method:"POST",body:o})},confirm(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/work-email/confirm`,{...n,method:"POST",body:o})}},jobs:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs`,{...n,query:o})},retrieve(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,n)},create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},delete(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},publish(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/publish`,{...n,method:"POST"})},unpublish(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/unpublish`,{...n,method:"POST"})},checkout(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/jobs/${encodeURIComponent(o)}/checkout`,{...r,method:"POST",body:n})}},billingOptions:{list(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/billing-options`,o)}},billingPortal:{create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/billing-portal`,{...n,method:"POST",body:o})}},jobStats:{retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/job-stats`,o)},timeseries(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/job-stats/timeseries`,{...n,query:o})}},profileStats:{retrieve(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/profile-stats`,o)},timeseries(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/profile-stats/timeseries`,{...n,query:o})}},recommendedTalent:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/recommended-talent`,{...n,query:o})}},talentLists:{list(e,o){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists`,o)},create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/talent-lists/${encodeURIComponent(o)}`,{...n,method:"DELETE"})}},sourcedCandidates:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates`,{...n,query:o})},add(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates`,{...n,method:"POST",body:o})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},convert(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/sourced-candidates/${encodeURIComponent(o)}/convert`,{...r,method:"POST",body:n})}},applicants:{list(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants`,{...n,query:o})},move(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/${encodeURIComponent(o)}/stage`,{...r,method:"PATCH",body:n})},bulkMove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/bulk/move`,{...n,method:"POST",body:o})},bulkReject(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/bulk/reject`,{...n,method:"POST",body:o})},addNote(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/applicants/${encodeURIComponent(o)}/notes`,{...r,method:"POST",body:n})}},pipelineStages:{create(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages`,{...n,method:"POST",body:o})},update(e,o,n,r){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},reorder(e,o,n){return t.fetch(`/me/companies/${encodeURIComponent(e)}/pipeline-stages/reorder`,{...n,method:"PUT",body:o})}}},talentAccess:{retrieve(e){return t.fetch("/me/talent-access",e)},retrieveCandidate(e,o){return t.fetch(`/me/talent-access/candidates/${encodeURIComponent(e)}`,o)},checkout(e,o){return t.fetch("/me/talent-access/checkout",{...o,method:"POST",body:e})},retrieveCheckout(e,o){return t.fetch(`/me/talent-access/checkout/${encodeURIComponent(e)}`,o)},unlock(e,o){return t.fetch("/me/talent-access/unlocks",{...o,method:"POST",body:e})},upgrade(e,o){return t.fetch("/me/talent-access/upgrade",{...o,method:"POST",body:e})}},alerts:{list(e){return t.fetch("/me/alerts",e)},create(e,o){return t.fetch("/me/alerts",{...o,method:"POST",body:e})},retrieve(e,o){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,o)},update(e,o,n){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,{...n,method:"PUT",body:o})},remove(e,o){return t.fetch(`/me/alerts/${encodeURIComponent(e)}`,{...o,method:"DELETE"})}},applications:{list(e,o){return t.fetch("/me/applications",{...o,query:e})},retrieve(e,o){return t.fetch(`/me/applications/${encodeURIComponent(e)}`,o)},updateFacts(e,o,n){return t.fetch(`/me/applications/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},withdraw(e,o){return t.fetch(`/me/applications/${encodeURIComponent(e)}/withdraw`,{...o,method:"POST"})}},resume:{upload(e,o,n){let r=new FormData;return r.append("resume",e),o?.keepResumeOnFile&&r.append("keepResumeOnFile","true"),o?.importMode&&r.append("importMode",o.importMode),o?.confirmReplaceAll&&r.append("confirmReplaceAll","true"),t.fetch("/me/resume",{...n,method:"POST",body:r})},retrieve(e){return t.fetch("/me/resume",e)},delete(e){return t.fetch("/me/resume",{...e,method:"DELETE"})}},recommendedJobs:{list(e,o){return t.fetch("/me/recommended-jobs",{...o,query:e})}},savedJobs:{list(e,o){return t.fetch("/me/saved-jobs",{...o,query:e})},save(e,o,n){return t.fetch("/me/saved-jobs",{...n,method:"POST",body:e,query:o})},unsave(e,o,n){return t.fetch(`/me/saved-jobs/${encodeURIComponent(e)}`,{...n,method:"DELETE",query:o})}},conversations:{list(e,o){return t.fetch("/me/conversations",{...o,query:e})},unreadCount(e){return t.fetch("/me/conversations/unread-count",e)},retrieve(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}`,o)},listMessages(e,o,n){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/messages`,{...n,query:o})},start(e,o){return t.fetch("/me/conversations",{...o,method:"POST",body:e})},startAboutApplication(e,o){return t.fetch("/me/conversations/about-application",{...o,method:"POST",body:e})},reply(e,o,n){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/reply`,{...n,method:"POST",body:o})},markRead(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/read`,{...o,method:"POST"})},archive(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/archive`,{...o,method:"POST"})},unarchive(e,o){return t.fetch(`/me/conversations/${encodeURIComponent(e)}/unarchive`,{...o,method:"POST"})},findExisting(e,o){return t.fetch("/me/conversations/find-existing",{...o,query:e})}},blocks:{list(e){return t.fetch("/me/blocks",e)},create(e,o){return t.fetch("/me/blocks",{...o,method:"POST",body:e})},remove(e,o){return t.fetch(`/me/blocks/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},status(e,o){return t.fetch(`/me/blocks/${encodeURIComponent(e)}`,o)}},messages:{edit(e,o,n){return t.fetch(`/me/messages/${encodeURIComponent(e)}`,{...n,method:"PATCH",body:o})},unsend(e,o){return t.fetch(`/me/messages/${encodeURIComponent(e)}`,{...o,method:"DELETE"})},report(e,o,n){return t.fetch(`/me/messages/${encodeURIComponent(e)}/report`,{...n,method:"POST",body:o})}},marketingConsent:{retrieve(e){return t.fetch("/me/marketing-consent",e)},grant(e){return t.fetch("/me/marketing-consent/grant",{...e,method:"POST"})},withdraw(e){return t.fetch("/me/marketing-consent/withdraw",{...e,method:"POST"})}},access:{checkout(e,o){return t.fetch("/me/access/checkout",{...o,method:"POST",body:e})},retrieveCheckout(e,o){return t.fetch(`/me/access/checkout/${encodeURIComponent(e)}`,o)},grant(e){return t.fetch("/me/access/grant",e)},portal(e,o){return t.fetch("/me/access/portal",{...o,method:"POST",body:e})}}}}function Me(t){return{async verify(e,o){let n=await t.fetch("/password/verify",{...o,method:"POST",body:{password:e}});return await t.storage.setItem(F,n.token),n}}}function Je(t){return{offers(e){return t.fetch("/paywall/offers/enabled",e)}}}function we(t){return{list(e,o){return t.fetch("/plans",{...o,query:e})},salesLed(e){return t.fetch("/sales-led-plans",e)}}}function Ne(t){return{resolve(e,o){return t.fetch("/redirects/resolve",{...o,query:{path:e}})}}}function $e(t){return{companies:{list(e){return t.fetch("/salaries/companies",e)}},titles:{list(e,o){return t.fetch("/salaries/titles",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}`,{...n,query:o})},locations(e,o,n){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}/locations`,{...n,query:o})},location(e,o,n,r){return t.fetch(`/salaries/titles/${encodeURIComponent(e)}/${encodeURIComponent(o)}`,{...r,query:n})}},skills:{list(e,o){return t.fetch("/salaries/skills",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}`,{...n,query:o})},locations(e,o,n){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}/locations`,{...n,query:o})},location(e,o,n,r){return t.fetch(`/salaries/skills/${encodeURIComponent(e)}/${encodeURIComponent(o)}`,{...r,query:n})}},locations:{list(e,o){return t.fetch("/salaries/locations",{...o,query:e})},retrieve(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}`,{...n,query:o})},titles(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}/titles`,{...n,query:o})},skills(e,o,n){return t.fetch(`/salaries/locations/${encodeURIComponent(e)}/skills`,{...n,query:o})}}}}function De(t){return{suggest(e,o){return t.fetch("/search/suggest",{...o,query:e})}}}function je(t){return Object.assign(e=>t.fetch("/sitemap",e),{entries(e,o,n){return t.fetch(`/sitemap/${encodeURIComponent(e)}`,{...n,query:o})}})}function Qe(t){return{list(e,o){return t.fetch("/talent",{...o,query:e})},retrieve(e,o){return t.fetch(`/talent/${encodeURIComponent(e)}`,o)}}}function Ge(t,e){return{resolve(o,n){return t.fetch(`/${e}/${encodeURIComponent(o)}`,n)}}}function qe(t,e){return{...Ge(t,e),list(o,n){return t.fetch(`/${e}`,{...n,query:o})}}}function He(t){return{categories:qe(t,"categories"),skills:qe(t,"skills"),remotePermits:{list(e){return t.fetch("/remote-permits",e)}},places:{...Ge(t,"places"),list(e,o){return t.fetch("/places",{...o,query:e})}}}}function Ve(t,e,o){async function*n(){let r=e;for(;;){let i=await t(r,o);if(yield i,!i.hasMore||i.nextCursor===null)return;let{offset:a,...s}=r??{};r={...s,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 a of n())if(i.push(...a.data),i.length>=r)break;return i.slice(0,r)}}}function Ke(t,e){return t.authorBoardUserId!==e}function Ye(t,e){let o=t.some(r=>r.authorBoardUserId===e);return t.some(r=>r.authorBoardUserId!==e)&&!o}function We(t,e){for(let o=t.length-1;o>=0;o--){let n=t[o];if(n.authorBoardUserId!==e)return n.id}return null}function X(t){let e=t.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,"").replace(/[\t\n\r]/g,""),o=/^([a-z][a-z0-9+.-]*):/i.exec(e)?.[1]?.toLowerCase();return o===void 0?!0:o==="http"||o==="https"||o==="mailto"}function ee(t){let e=t.applicationUrl&&X(t.applicationUrl)?t.applicationUrl:null;return!e&&!t.jobSlug?{kind:"none"}:t.registrationWall&&!t.viewer?{kind:"sign-in",reason:"registration-wall"}:e?{kind:"external",url:e}:t.jobSlug?t.viewer?t.viewer.emailVerified?t.applied?{kind:"applied"}:{kind:"native",jobSlug:t.jobSlug}:{kind:"verify-email"}:t.allowGuestApply?{kind:"guest",jobSlug:t.jobSlug}:{kind:"sign-in",reason:"native-apply"}:{kind:"none"}}function ze(t){let e=ee({...t,registrationWall:!1,allowGuestApply:!1});return e.kind==="sign-in"?{kind:"sign-in"}:e}function eo(t){let e=new I({baseUrl:t.baseUrl??Re,board:t.board,storage:ve(t.auth?.storage,t.board),globalHeaders:t.globalHeaders,onRequest:t.onRequest,onResponse:t.onResponse,logger:t.logger});return{client:e,context(o){return e.fetch("",o)},seo(o){return e.fetch("/seo",o)},jobs:ke(e),embed:Fe(e),companies:Le(e),blog:Te(e),auth:_e(e),me:Ue(e),password:Me(e),taxonomy:He(e),search:De(e),redirects:Ne(e),jobAlerts:Ie(e),jobPosting:xe(e),salaries:$e(e),talent:Qe(e),plans:we(e),paywall:Je(e),sitemap:je(e)}}var te={};_(te,{DEFAULT_SORT:()=>to,EMPLOYMENT_TYPES:()=>Xe,JOB_SORTS:()=>tt,REMOTE_OPTIONS:()=>Ze,SENIORITIES:()=>et,parseCompany:()=>nt,parseListingFilters:()=>no,parseSeniority:()=>ot});var Ze=["on_site","hybrid","remote"],Xe=["full_time","part_time","contract","internship","temporary"],et=["entry_level","associate","mid_level","senior","lead","principal","director","executive"],tt=["relevance","newest","salary_high"],to="relevance";var oo=new Set(et);function ot(t){let e=Array.isArray(t)?t:typeof t=="string"&&t?t.split(","):[],o=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");!i||n.has(i)||oo.has(i)&&(n.add(i),o.push(i))}return o.length>0?o:void 0}function nt(t){let e=Array.isArray(t)?t:typeof t=="string"&&t?t.split(","):[],o=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");if(!(!i||n.has(i))&&(n.add(i),o.push(i),o.length>=10))break}return o.length>0?o:void 0}function no(t){return{q:typeof t.q=="string"&&t.q?t.q:void 0,remoteOption:Ze.includes(t.remoteOption)?t.remoteOption:void 0,employmentType:Xe.includes(t.employmentType)?t.employmentType:void 0,seniority:ot(t.seniority),company:nt(t.company),sort:tt.includes(t.sort)?t.sort:void 0}}var ce={};_(ce,{COUNTRY_CODES:()=>W,buildJobBreadcrumbs:()=>Y,countryOptions:()=>Ut,formatDate:()=>lt,formatMonthYear:()=>ct,formatPublishedRelativeDate:()=>pt,formatSalaryRange:()=>ut,formatSalaryStat:()=>j,formatSalaryStatRange:()=>x,normalizeWebsiteUrl:()=>U,resolveCustomFieldDisplay:()=>Mt});function S(t){let e=t.trim();if(!e)return null;try{let o=e.replace(/_/g,"-"),[n]=Intl.getCanonicalLocales(o);if(!n)return null;let[r]=Intl.NumberFormat.supportedLocalesOf([n]);return r??null}catch{return null}}var rt=new Map,it=new Map,at=new Map,st=new Map;function ro(t){let e=rt.get(t);return e||(e=new Intl.RelativeTimeFormat(t,{numeric:"always",style:"short"}),rt.set(t,e)),e}function io(t){let e=it.get(t);return e||(e=new Intl.RelativeTimeFormat(t,{numeric:"auto",style:"short"}),it.set(t,e)),e}function ao(t){let e=at.get(t);return e||(e=new Intl.DateTimeFormat(t,{dateStyle:"medium",timeZone:"UTC"}),at.set(t,e)),e}function so(t){let e=st.get(t);return e||(e=new Intl.DateTimeFormat(t,{month:"short",year:"numeric",timeZone:"UTC"}),st.set(t,e)),e}function oe(t,e,o){try{return ro(o).format(t,e)}catch{return null}}function lt(t,e){if(!e)return null;let o=new Date(e);if(Number.isNaN(o.getTime()))return null;let n=S(t);if(!n)return null;try{return ao(n).format(o)}catch{return o.toISOString().split("T")[0]}}function pt(t,e,o=Date.now()){if(!e)return null;let n=new Date(e);if(Number.isNaN(n.getTime()))return null;let r=S(t);if(!r)return null;let i=o-n.getTime(),a=Math.abs(i),s=60*1e3,p=60*s,l=24*p,u=7*l,d=30*l,m=365*l;if(a<s)try{return io(r).format(0,"second")}catch{return oe(0,"second",r)}let y=[{unit:"year",ms:m},{unit:"month",ms:d},{unit:"week",ms:u},{unit:"day",ms:l},{unit:"hour",ms:p},{unit:"minute",ms:s}];for(let f of y)if(a>=f.ms){let P=Math.round(a/f.ms),c=i>=0?-P:P;return oe(c,f.unit,r)}let g=Math.round(a/1e3),C=i>=0?-g:g;return oe(C,"second",r)}function ct(t,e){if(!e)return null;let n=/^\d{4}-\d{2}(-\d{2})?$/.test(e)?new Date(e.length===7?`${e}-01T00:00:00.000Z`:`${e}T00:00:00.000Z`):new Date(e);if(Number.isNaN(n.getTime()))return null;let r=S(t);if(!r)return null;try{return so(r).format(n)}catch{return null}}var $=new Map;function ne(t,e,o,n="symbol",r="compact"){let i=`${e}:${o}:${n}:${r}`,a=$.get(i);if(a===void 0){try{let s={style:"currency",currency:o,currencyDisplay:n,notation:r};r==="compact"&&(s.compactDisplay="short",s.maximumFractionDigits=1,s.minimumFractionDigits=0),a=new Intl.NumberFormat(e,s)}catch{a=null}$.set(i,a)}return a?a.format(t):null}function re(t,e,o){if(typeof t.formatRange=="function")try{return t.formatRange(e,o)}catch{}try{return`${t.format(e)}\u2013${t.format(o)}`}catch{return null}}function lo(t,e,o,n,r="symbol",i="compact"){let a=`${o}:${n}:${r}:${i}:range`,s=$.get(a);if(s===void 0){try{let p={style:"currency",currency:n,currencyDisplay:r,notation:i};i==="compact"&&(p.compactDisplay="short",p.maximumFractionDigits=1,p.minimumFractionDigits=0),s=new Intl.NumberFormat(o,p)}catch{s=null}$.set(a,s)}return s?re(s,t,e):null}var po=new Set(["per_year","per_month","per_week","per_day","per_hour"]);function co(...t){let e=!1;for(let o of t)if(!(o==null||!Number.isFinite(o))&&(e=!0,Math.abs(o)>=1e3))return"compact";return e?"standard":"compact"}function ut(t,e,o,n,r=null,i="symbol",a){let s=e==null||Number.isFinite(e),p=o==null||Number.isFinite(o);if(!s||!p||e==null&&o==null)return null;let l=r?.trim().toUpperCase()||null;if(!l)return null;let u=S(t);if(!u)return null;let d=a??co(e,o),m=typeof n=="string"&&po.has(n)?n:null;if(e!=null&&o!=null){let g=e<=o?e:o,C=e<=o?o:e,f=g===C?ne(g,u,l,i,d):lo(g,C,u,l,i,d);return f?{text:f,timeframe:m,bound:"range"}:null}if(e!=null){let g=ne(e,u,l,i,d);return g?{text:g,timeframe:m,bound:"from"}:null}let y=ne(o,u,l,i,d);return y?{text:y,timeframe:m,bound:"upTo"}:null}var mt=new Map;function dt(...t){let e=!1;for(let o of t)if(!(o==null||!Number.isFinite(o))&&(e=!0,Math.abs(o)>=1e3))return"compact";return e?"standard":"compact"}function yt(t,e,o){let n=`${t}:${e}:${o}`,r=mt.get(n);if(r!==void 0)return r;let i;try{let a={style:"currency",currency:e,notation:o};o==="compact"&&(a.compactDisplay="short",a.minimumFractionDigits=0,a.maximumFractionDigits=1),i=new Intl.NumberFormat(t,a)}catch{i=null}return mt.set(n,i),i}function j(t,e,o,n){if(!Number.isFinite(e))return null;let r=o?.trim().toUpperCase()||null;if(!r)return null;let i=S(t);if(!i)return null;let a=n??dt(e),s=yt(i,r,a);return s?s.format(e):null}function x(t,e,o,n,r){if(!Number.isFinite(e)||!Number.isFinite(o))return null;let i=n?.trim().toUpperCase()||null;if(!i)return null;let a=S(t);if(!a)return null;let s=r??dt(e,o),p=yt(a,i,s);if(!p)return null;let l=Math.min(e,o),u=Math.max(e,o);return l===u?p.format(l):re(p,l,u)}var D=["entry_level","associate","mid_level","senior","lead","principal","director","executive"];function gt(t){return[...t].sort((e,o)=>{let n=D.indexOf(e.seniority),r=D.indexOf(o.seniority);return(n===-1?999:n)-(r===-1?999:r)})}var uo={unitText:"YEAR",duration:"P1Y"};function k(t,e,o,n,r={}){return{"@type":"MonetaryAmountDistribution",...t!==void 0?{name:t}:{},currency:e,minValue:o,maxValue:n,...r,...uo}}function ie(t,e,o,n){return t.map(r=>{let i=n?.seniorityName?.({seniority:r.seniority,entity:o});return k(i,e,r.avgSalaryMin,r.avgSalaryMax)})}function Q(t,e,o,n){return{"@context":"https://schema.org","@type":t,name:e,...o,estimatedSalary:n}}function ft(t,e,o,n){if(!o)return[];let r=x(t,o.avgMin,o.avgMax,n);return[{kind:"average",label:e,range:r,avgMin:o.avgMin,avgMax:o.avgMax,currency:n,jobCount:o.jobCount},{kind:"methodology",label:e}]}function q(t){return t.length===0?null:{"@context":"https://schema.org","@type":"ItemList",numberOfItems:t.length,itemListElement:t.map((e,o)=>({"@type":"ListItem",position:o+1,name:e.name,url:e.url}))}}function ht(t){return t.length===0?null:{"@context":"https://schema.org","@type":"FAQPage",mainEntity:t.map(e=>({"@type":"Question",name:e.q,acceptedAnswer:{"@type":"Answer",text:e.a}}))}}function bt(t,e){return t.overallSalary?Q("Occupation",t.categoryName,{},[k(t.categoryName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{...t.boardP25Min?{percentile25:t.boardP25Min}:{},...t.boardP75Max?{percentile75:t.boardP75Max}:{}}),...ie(t.bySeniority,t.currency,t.categoryName,e)]):null}function St(t){return t.overallSalary?Q("Occupation",t.skillName,{},[k(t.skillName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{median:Math.round((t.overallSalary.medianMin+t.overallSalary.medianMax)/2)})]):null}function Ct(t,e){return!e?.occupationUrl||!(t.adminLevel==="city"||t.adminLevel==="locality")?null:q(t.topCategories.map(n=>({name:n.categoryName,url:e.occupationUrl(n)})))}function Ot(t,e){return t.overall?Q("Occupation",t.name,{occupationLocation:{"@type":"AdministrativeArea",name:t.placeName,address:{"@type":"PostalAddress",addressCountry:t.countryCode}}},[k(t.name,t.currency,t.overall.avgMin,t.overall.avgMax,{...t.overall.p25Min?{percentile25:t.overall.p25Min}:{},...t.overall.p75Max?{percentile75:t.overall.p75Max}:{}}),...ie(t.bySeniority,t.currency,t.name,e)]):null}function Et(t,e){return e?.occupationUrl?q(t.byCategory.map(o=>({name:o.categoryName,url:e.occupationUrl(o)}))):null}function Bt(t,e){return t.overallSalary?Q("Occupation",t.categoryName,{occupationalCategory:t.categoryName,hiringOrganization:{"@type":"Organization",name:t.companyName}},[k(t.categoryName,t.currency,t.overallSalary.avgMin,t.overallSalary.avgMax,{...t.boardCategoryP25Min?{percentile25:t.boardCategoryP25Min}:{},...t.boardCategoryP75Max?{percentile75:t.boardCategoryP75Max}:{}}),...ie(t.bySeniority,t.currency,t.categoryName,e)]):null}function At(t,e){return t.company?.name??e.legalName??e.contact?.legalName??e.name??null}var Pt={high_school:"high school",associate_degree:"associate degree",bachelor_degree:"bachelor degree",professional_certificate:"professional certificate",postgraduate_degree:"postgraduate degree"},mo={full_time:"FULL_TIME",part_time:"PART_TIME",contract:"CONTRACTOR",internship:"INTERN",temporary:"TEMPORARY",volunteer:"VOLUNTEER",other:"OTHER"},yo={per_year:"YEAR",per_month:"MONTH",per_week:"WEEK",per_day:"DAY",per_hour:"HOUR"},se=["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 Rt({job:t,board:e,shareUrl:o}){let n=Oo(t),r=Eo(t),i=ae({"@context":"https://schema.org/","@type":"JobPosting",title:t.title,description:t.description??"",identifier:go(t,e),datePosted:vt(t.publishedAt),validThrough:vt(t.expiresAt),employmentType:t.employmentType?mo[t.employmentType]??"OTHER":"OTHER",hiringOrganization:fo(t,e),jobLocation:bo(t),jobLocationType:t.remoteOption==="remote"?"TELECOMMUTE":void 0,applicantLocationRequirements:t.remoteOption==="remote"?Co(t):null,baseSalary:ho(t),educationRequirements:n,experienceRequirements:r,experienceInPlaceOfEducation:t.experienceInPlaceOfEducation===!0&&n&&r?!0:void 0,url:o});return!i||Array.isArray(i)||Object.keys(i).length===0?null:i}function go(t,e){let o=At(t,e),n={"@type":"PropertyValue",value:t.id};return o&&(n.name=o),n}function fo(t,e){let o=At(t,e);if(!o)return null;let n={"@type":"Organization",name:o},r=t.company?.website??null,i=r?U(r):null;i&&(n.sameAs=i);let a=t.company?.logoUrl??e.logoUrl??null;return a&&(n.logo=a),n}function U(t){let e=t.trim();return e?/^https?:\/\//i.test(e)?e:`https://${e}`:null}function ho(t){let e=t.salaryCurrency?.trim(),o=typeof t.salaryMin=="number",n=typeof t.salaryMax=="number";if(!e||!o&&!n)return null;let r={"@type":"QuantitativeValue"};o&&(r.minValue=t.salaryMin),n&&(r.maxValue=t.salaryMax);let i=t.salaryTimeframe?yo[t.salaryTimeframe]:void 0;return i&&(r.unitText=i),!o&&n&&typeof t.salaryMax=="number"?(r.value=t.salaryMax,r.minValue=t.salaryMax):!n&&o&&typeof t.salaryMin=="number"&&(r.value=t.salaryMin,r.maxValue=t.salaryMin),{"@type":"MonetaryAmount",currency:e.toUpperCase(),value:r}}function bo(t){let e=t.officeLocations.map(o=>So({countryCode:o.countryCode,region:o.region,locality:o.city??o.locality,postalCode:o.postalCode,name:o.displayName})).filter(o=>o!==null);return e.length===0?null:e.length===1?e[0]:e}function So({countryCode:t,region:e,locality:o,postalCode:n,name:r}){let i={"@type":"PostalAddress"},a=t?.trim(),s=e?.trim(),p=o?.trim(),l=n?.trim(),u=r?.trim();a&&(i.addressCountry=a.toUpperCase()),s&&(i.addressRegion=s),p&&(i.addressLocality=p),l&&(i.postalCode=l);let d=Object.keys(i).length>1;if(!d&&!u)return null;let m={"@type":"Place"};return u&&(m.name=u),d&&(m.address=i),m}function Co(t){if(t.remoteWorldwide)return se.map(n=>({"@type":"Country",name:n}));let e=[],o=new Set;for(let n of t.remoteWorkPermitCountryCodes??[]){let r=n?.trim().toUpperCase();!r||o.has(r)||(o.add(r),e.push({"@type":"Country",name:r}))}for(let n of t.remoteWorkPermitSubdivisionCodes??[]){let r=n?.split("-")[0]?.trim().toUpperCase();!r||o.has(r)||(o.add(r),e.push({"@type":"Country",name:r}))}return e.length===0?null:e.length===1?e[0]:e}function Oo(t){let e=t.educationRequirements;if(!e||e.length===0)return null;if(e.includes("no_requirements"))return"no requirements";let o=e.filter(n=>n in Pt).map(n=>({"@type":"EducationalOccupationalCredential",credentialCategory:Pt[n]}));return o.length>0?o:null}function Eo(t){let e=t.experienceMonths;return typeof e!="number"?null:e===0?"no requirements":{"@type":"OccupationalExperienceRequirements",monthsOfExperience:e}}function vt(t){if(!t)return null;let e=new Date(t);return Number.isNaN(e.getTime())?null:e.toISOString()}function ae(t){let e=o=>o==null?!1:Array.isArray(o)?o.length>0:typeof o=="object"?Object.keys(o).length>0:!0;if(Array.isArray(t))return t.map(o=>ae(o)).filter(e);if(t&&typeof t=="object"){let o=Object.entries(t).map(([n,r])=>[n,ae(r)]).filter(([,n])=>e(n));return Object.fromEntries(o)}return t}var pe={};_(pe,{BOARD_PATHS:()=>V,blogAuthorPath:()=>_o,blogPostPath:()=>It,blogTagPath:()=>xt,boardUrl:()=>K,companyMarketPath:()=>Ft,companyPath:()=>Lt,companySalaryPath:()=>Po,encodePathSegment:()=>h,goAlertsConfirmPath:()=>Fo,goAlertsManagePath:()=>Lo,goJobPath:()=>To,jobDetailPath:()=>le,jobsCategoryPath:()=>G,jobsLocationCategoryPath:()=>H,jobsLocationPath:()=>M,jobsLocationSkillPath:()=>Tt,jobsSkillPath:()=>_t,salaryLocationPath:()=>Ro,salarySkillPath:()=>Ao,salaryTitlePath:()=>vo,suggestionPath:()=>Bo});function h(t){try{return encodeURIComponent(decodeURIComponent(t)).replace(/%3A/gi,":")}catch{return encodeURIComponent(t).replace(/%3A/gi,":")}}function le(t,e){return`/companies/${h(t)}/jobs/${h(e)}`}function G(t){return`/jobs/${h(t)}`}function _t(t){return`/jobs/skills/${h(t)}`}function M(t){return`/jobs/locations/${h(t)}`}function H(t,e){return`${M(t)}/${h(e)}`}function Tt(t,e){return`${M(t)}/skills/${h(e)}`}function Lt(t){return`/companies/${h(t)}`}function Ft(t){return`/companies/markets/${h(t)}`}function Bo(t,e){let o=e.location?.trim()||void 0;return e.scope==="blog"?t.type==="post"?It(t.slug):t.type==="tag"?xt(t.slug):null:e.scope==="jobs"?t.type==="company"||t.type==="market"||t.type==="post"||t.type==="tag"?null:t.termType==="skill"?o?Tt(o,t.canonicalSlug):_t(t.canonicalSlug):o?H(o,t.canonicalSlug):G(t.canonicalSlug):t.type==="company"?Lt(t.slug):t.type==="market"?Ft(t.slug):null}function Po(t){return`/companies/${h(t)}/salaries`}function vo(t){return`/salaries/titles/${h(t)}`}function Ao(t){return`/salaries/skills/${h(t)}`}function Ro(t){return`/salaries/locations/${h(t)}`}function It(t){return`/blog/${h(t)}`}function xt(t){return`/blog/tag/${h(t)}`}function _o(t){return`/blog/author/${h(t)}`}var V={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 To(t){return`/go/job/${t}`}function Lo(){return"/go/alerts-manage"}function Fo(){return"/go/alerts-confirm"}function K(t,e){return`${t.replace(/\/+$/,"")}${e}`}function kt(t,e={}){let o=t.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 a=r.href?Io(r.href,e.origin??null):null,s={"@type":"ListItem",position:i+1,name:r.name};return a&&(s.item=a),s})}}function Io(t,e){if(xo(t))return t;if(!e)return null;let o=t.startsWith("/")?t:`/${t}`;return`${e}${o}`}function xo(t){return/^https?:\/\//i.test(t)}function Y(t){let e=[{kind:"home",path:V.home},{kind:"jobs",path:V.jobs}],o=null;for(let r of t.placeHierarchy)o=r.slug,e.push({kind:"place",name:r.name,path:M(r.slug)});let n=t.categories[0];return n&&e.push({kind:"category",name:n.name,path:o?H(o,n.slug):G(n.slug)}),e.push({kind:"job",name:t.title}),e}var W=["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 ko(t){try{return new Intl.DisplayNames([t],{type:"region"})}catch{return null}}function Uo(t){try{return new Intl.Collator(t)}catch{return new Intl.Collator}}function Ut(t){let e=S(t);if(!e)return W.map(r=>({code:r,name:r})).sort((r,i)=>r.code<i.code?-1:r.code>i.code?1:0);let o=ko(e),n=Uo(e).compare;return W.map(r=>({code:r,name:o?.of(r)??r})).sort((r,i)=>n(r.name,i.name))}function Mo(t,e){if(!Array.isArray(e)||e.length===0)return null;let o=e.map(n=>t.options?.find(r=>r.key===n)?.label).filter(n=>!!n);return o.length>0?o:null}function Jo(t,e){switch(t.type){case"number":return null;case"multi_select":return null;case"single_select":return typeof e!="string"?null:t.options?.find(o=>o.key===e)?.label??null;default:return typeof e=="string"&&e.trim()!==""?e:null}}function Mt(t,e,o){let n=[];for(let r of e??[]){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 s=Mo(r,i);s&&n.push({key:r.key,label:r.label,kind:"multi_select",values:s});continue}let a=Jo(r,i);a!==null&&n.push({key:r.key,label:r.label,kind:"text",value:a})}return n}var ue={};_(ue,{ALL_COUNTRY_CODES:()=>se,SENIORITY_ORDER:()=>D,buildJobBreadcrumbs:()=>Y,buildSalaryFaq:()=>ft,companyCategorySalaryJsonLd:()=>Bt,companySalaryJsonLd:()=>Et,createAuthorProfileJsonLd:()=>wt,createBlogArticleJsonLd:()=>Jt,createBreadcrumbJsonLd:()=>kt,createJobPostingJsonLd:()=>Rt,crossAxisSalaryJsonLd:()=>Ot,faqJsonLd:()=>ht,formatSalaryStat:()=>j,formatSalaryStatRange:()=>x,itemListJsonLd:()=>q,listingHead:()=>Nt,listingJsonLd:()=>$t,locationSalaryJsonLd:()=>Ct,normalizeWebsiteUrl:()=>U,skillSalaryJsonLd:()=>St,sortBySeniority:()=>gt,titleSalaryJsonLd:()=>bt});function Jt({post:t,boardName:e,permalink:o,ogImageUrl:n}){let r={"@context":"https://schema.org","@type":"Article",headline:t.title,url:o,mainEntityOfPage:{"@type":"WebPage","@id":o},publisher:{"@type":"Organization",name:e}};t.customExcerpt&&(r.description=t.customExcerpt),t.publishedAt&&(r.datePublished=t.publishedAt);let i=t.coverUrl??n;i&&(r.image=i);let a=t.authors[0];return a&&(r.author={"@type":"Person",name:a.name,...a.websiteUrl?{url:a.websiteUrl}:{}}),r}function wt({author:t,canonical:e,description:o,origin:n,posts:r,totalPosts:i}){if(!t.name)return null;let a=o.trim(),s=[z(t.websiteUrl),z(t.twitterUrl),z(t.linkedinUrl),z(t.githubUrl)].filter(m=>!!m),p=`${e}#profile`,l=r.slice(0,5).map(m=>{let y=wo(n,`/blog/${m.slug}`);return y?{"@type":"Article",headline:m.title,url:y,datePublished:m.publishedAt,author:{"@id":p}}:null}).filter(m=>m!==null),u=i>0?{"@type":"InteractionCounter",interactionType:"https://schema.org/WriteAction",userInteractionCount:i}:void 0,d={"@context":"https://schema.org","@type":"ProfilePage",url:e,mainEntity:{"@type":"Person","@id":p,name:t.name,alternateName:t.slug??void 0,identifier:t.id??void 0,description:a||void 0,image:t.avatarUrl??void 0,sameAs:s.length>0?s:void 0,url:e,mainEntityOfPage:e,agentInteractionStatistic:u}};return l.length>0&&(d.hasPart=l),d}function z(t){if(!t)return null;let e=t.trim();if(!e)return null;try{let o=e.startsWith("http://")||e.startsWith("https://")?e:`https://${e}`;return new URL(o).toString()}catch{return null}}function wo(t,e){if(!t||!e)return null;try{return new URL(e,t).toString()}catch{return null}}function Nt(t){let e=t.title,o=t.description,n=`${t.origin}${t.path}`;return{meta:[{title:e},{name:"description",content:o},{property:"og:title",content:e},{property:"og:description",content:o},{property:"og:type",content:"website"},{property:"og:url",content:n}],links:[{rel:"canonical",href:n}]}}function $t(t){let e=[];t.breadcrumbs.length>=2&&e.push({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:t.breadcrumbs.map((n,r)=>({"@type":"ListItem",position:r+1,name:n.name,...n.path?{item:K(t.origin,n.path)}:{}}))});let o=(t.jobs??[]).filter(n=>n.company!=null&&!!n.company.slug);return o.length>0&&e.push({"@context":"https://schema.org","@type":"ItemList",itemListElement:o.map((n,r)=>({"@type":"ListItem",position:r+1,url:K(t.origin,le(n.company.slug,n.slug))}))}),e}var me={};_(me,{createSuggestController:()=>Do});function No(t){return typeof DOMException<"u"&&t instanceof DOMException&&t.name==="AbortError"||t instanceof Error&&t.name==="AbortError"}function $o(t){try{let e=0;for(let o of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(t))e+=1;return e}catch{return[...t].length}}function Dt(t,e){return e.size===0?t.slice():t.filter(o=>!(o.type==="company"&&e.has(o.slug.toLowerCase().normalize("NFC"))))}function Do(t,e){let o=e?.minChars??2,n=e?.debounceMs??250,r=e?.limit,i=!1,a={query:"",items:[],status:"idle",error:null},s=[],p=new Set,l=0,u=null,d=null,m=new Set;function y(){for(let c of m)c()}function g(c){a=c,y()}function C(){u!==null&&(globalThis.clearTimeout(u),u=null)}function f(){d&&(d.abort(),d=null)}function P(c){let b=++l;f();let O=new AbortController;d=O;let R={q:c};r!==void 0&&(R.limit=r),t.search.suggest(R,{signal:O.signal}).then(v=>{i||b!==l||(d=null,s=v.items,g({query:a.query,items:Dt(s,p),status:"ready",error:null}))}).catch(v=>{i||b!==l||No(v)||(d=null,g({query:a.query,items:a.items,status:"error",error:v}))})}return{setQuery(c){if(i)return;let b=c.trim();if(C(),$o(b)<o){l+=1,f(),s=[],g({query:c,items:[],status:"idle",error:null});return}l+=1,f(),g({query:c,items:a.items,status:"loading",error:null}),u=globalThis.setTimeout(()=>{u=null,!i&&P(b)},n)},setExcludedCompanySlugs(c){i||(p=new Set(c.map(b=>b.trim().toLowerCase().normalize("NFC")).filter(Boolean)),g({query:a.query,items:Dt(s,p),status:a.status,error:a.error}))},getState(){return a},subscribe(c){return i?()=>{}:(m.add(c),()=>{m.delete(c)})},dispose(){i||(i=!0,C(),f(),l+=1,m.clear())}}}return Vt(jo);})();
|
package/dist/index.d.mts
CHANGED
|
@@ -150,7 +150,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
150
150
|
* constant because the package is platform-neutral and cannot read
|
|
151
151
|
* package.json at runtime.
|
|
152
152
|
*/
|
|
153
|
-
declare const SDK_VERSION = "4.
|
|
153
|
+
declare const SDK_VERSION = "4.23.0";
|
|
154
154
|
|
|
155
155
|
type SavedJob = Schemas['SavedJob'];
|
|
156
156
|
type SavedJobsListQuery = {
|
package/dist/index.d.ts
CHANGED
|
@@ -150,7 +150,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
150
150
|
* constant because the package is platform-neutral and cannot read
|
|
151
151
|
* package.json at runtime.
|
|
152
152
|
*/
|
|
153
|
-
declare const SDK_VERSION = "4.
|
|
153
|
+
declare const SDK_VERSION = "4.23.0";
|
|
154
154
|
|
|
155
155
|
type SavedJob = Schemas['SavedJob'];
|
|
156
156
|
type SavedJobsListQuery = {
|
package/dist/index.js
CHANGED
package/dist/index.mjs
CHANGED
package/dist/sitemap.d.mts
CHANGED
|
@@ -70,6 +70,36 @@ declare const MIN_JOBS_PER_INDEXED_PAGE = 5;
|
|
|
70
70
|
* urlset when a board lacks that content (valid, just zero URLs).
|
|
71
71
|
*/
|
|
72
72
|
declare function listedBuckets(board: BoardSdk): Promise<SitemapBucket[]>;
|
|
73
|
+
/**
|
|
74
|
+
* One listed bucket, with the freshness stamp the board publishes for it.
|
|
75
|
+
*
|
|
76
|
+
* `lastModified` is present only on the mirror path, and only for the buckets
|
|
77
|
+
* the board tracks one for — the legacy fallback has no such stamp, so it
|
|
78
|
+
* yields bucket names alone. Feed these straight to `renderSitemapIndex` and
|
|
79
|
+
* each `<sitemap>` gets a `<lastmod>`.
|
|
80
|
+
*/
|
|
81
|
+
interface ListedSitemapBucket {
|
|
82
|
+
bucket: SitemapBucket;
|
|
83
|
+
/** ISO 8601 timestamp of the newest content in the bucket, when known. */
|
|
84
|
+
lastModified?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Like `listedBuckets`, but keeps each bucket's `lastModified`. Same two
|
|
88
|
+
* paths, same ordering, same error rules — the only difference is that the
|
|
89
|
+
* freshness stamp survives.
|
|
90
|
+
*/
|
|
91
|
+
declare function listedBucketEntries(board: BoardSdk): Promise<ListedSitemapBucket[]>;
|
|
73
92
|
declare function buildBucketUrls(board: BoardSdk, origin: string, bucket: SitemapBucket): Promise<string[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Like `buildBucketUrls`, but keeps each URL's `lastModified` where the board
|
|
95
|
+
* publishes one. The result feeds `renderUrlset` directly, so every `<url>`
|
|
96
|
+
* that has a freshness stamp gets a `<lastmod>` — the signal crawlers use to
|
|
97
|
+
* prioritise recrawl across a large sitemap.
|
|
98
|
+
*
|
|
99
|
+
* On the legacy fallback path the catalog endpoints expose no per-URL stamp,
|
|
100
|
+
* so entries come back as `{ url }` only — identical output to
|
|
101
|
+
* `buildBucketUrls`, just in the wider shape.
|
|
102
|
+
*/
|
|
103
|
+
declare function buildBucketEntries(board: BoardSdk, origin: string, bucket: SitemapBucket): Promise<SitemapUrlEntry[]>;
|
|
74
104
|
|
|
75
|
-
export { MIN_JOBS_PER_INDEXED_PAGE, SITEMAP_BUCKETS, SITEMAP_CHUNK_SIZE, type SitemapBucket, type SitemapIndexEntry, type SitemapUrlEntry, bucketFilename, buildBucketUrls, chunk, listedBuckets, parseBucketFilename, renderSitemapIndex, renderUrlset, xmlEscape };
|
|
105
|
+
export { type ListedSitemapBucket, MIN_JOBS_PER_INDEXED_PAGE, SITEMAP_BUCKETS, SITEMAP_CHUNK_SIZE, type SitemapBucket, type SitemapIndexEntry, type SitemapUrlEntry, bucketFilename, buildBucketEntries, buildBucketUrls, chunk, listedBucketEntries, listedBuckets, parseBucketFilename, renderSitemapIndex, renderUrlset, xmlEscape };
|
package/dist/sitemap.d.ts
CHANGED
|
@@ -70,6 +70,36 @@ declare const MIN_JOBS_PER_INDEXED_PAGE = 5;
|
|
|
70
70
|
* urlset when a board lacks that content (valid, just zero URLs).
|
|
71
71
|
*/
|
|
72
72
|
declare function listedBuckets(board: BoardSdk): Promise<SitemapBucket[]>;
|
|
73
|
+
/**
|
|
74
|
+
* One listed bucket, with the freshness stamp the board publishes for it.
|
|
75
|
+
*
|
|
76
|
+
* `lastModified` is present only on the mirror path, and only for the buckets
|
|
77
|
+
* the board tracks one for — the legacy fallback has no such stamp, so it
|
|
78
|
+
* yields bucket names alone. Feed these straight to `renderSitemapIndex` and
|
|
79
|
+
* each `<sitemap>` gets a `<lastmod>`.
|
|
80
|
+
*/
|
|
81
|
+
interface ListedSitemapBucket {
|
|
82
|
+
bucket: SitemapBucket;
|
|
83
|
+
/** ISO 8601 timestamp of the newest content in the bucket, when known. */
|
|
84
|
+
lastModified?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Like `listedBuckets`, but keeps each bucket's `lastModified`. Same two
|
|
88
|
+
* paths, same ordering, same error rules — the only difference is that the
|
|
89
|
+
* freshness stamp survives.
|
|
90
|
+
*/
|
|
91
|
+
declare function listedBucketEntries(board: BoardSdk): Promise<ListedSitemapBucket[]>;
|
|
73
92
|
declare function buildBucketUrls(board: BoardSdk, origin: string, bucket: SitemapBucket): Promise<string[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Like `buildBucketUrls`, but keeps each URL's `lastModified` where the board
|
|
95
|
+
* publishes one. The result feeds `renderUrlset` directly, so every `<url>`
|
|
96
|
+
* that has a freshness stamp gets a `<lastmod>` — the signal crawlers use to
|
|
97
|
+
* prioritise recrawl across a large sitemap.
|
|
98
|
+
*
|
|
99
|
+
* On the legacy fallback path the catalog endpoints expose no per-URL stamp,
|
|
100
|
+
* so entries come back as `{ url }` only — identical output to
|
|
101
|
+
* `buildBucketUrls`, just in the wider shape.
|
|
102
|
+
*/
|
|
103
|
+
declare function buildBucketEntries(board: BoardSdk, origin: string, bucket: SitemapBucket): Promise<SitemapUrlEntry[]>;
|
|
74
104
|
|
|
75
|
-
export { MIN_JOBS_PER_INDEXED_PAGE, SITEMAP_BUCKETS, SITEMAP_CHUNK_SIZE, type SitemapBucket, type SitemapIndexEntry, type SitemapUrlEntry, bucketFilename, buildBucketUrls, chunk, listedBuckets, parseBucketFilename, renderSitemapIndex, renderUrlset, xmlEscape };
|
|
105
|
+
export { type ListedSitemapBucket, MIN_JOBS_PER_INDEXED_PAGE, SITEMAP_BUCKETS, SITEMAP_CHUNK_SIZE, type SitemapBucket, type SitemapIndexEntry, type SitemapUrlEntry, bucketFilename, buildBucketEntries, buildBucketUrls, chunk, listedBucketEntries, listedBuckets, parseBucketFilename, renderSitemapIndex, renderUrlset, xmlEscape };
|
package/dist/sitemap.js
CHANGED
|
@@ -24,8 +24,10 @@ __export(sitemap_exports, {
|
|
|
24
24
|
SITEMAP_BUCKETS: () => SITEMAP_BUCKETS,
|
|
25
25
|
SITEMAP_CHUNK_SIZE: () => SITEMAP_CHUNK_SIZE,
|
|
26
26
|
bucketFilename: () => bucketFilename,
|
|
27
|
+
buildBucketEntries: () => buildBucketEntries,
|
|
27
28
|
buildBucketUrls: () => buildBucketUrls,
|
|
28
29
|
chunk: () => chunk,
|
|
30
|
+
listedBucketEntries: () => listedBucketEntries,
|
|
29
31
|
listedBuckets: () => listedBuckets,
|
|
30
32
|
parseBucketFilename: () => parseBucketFilename,
|
|
31
33
|
renderSitemapIndex: () => renderSitemapIndex,
|
|
@@ -305,34 +307,57 @@ function enumerateCompanies(board) {
|
|
|
305
307
|
}
|
|
306
308
|
var MIRROR_PAGE = 1e3;
|
|
307
309
|
async function listedBuckets(board) {
|
|
310
|
+
const listed = await listedBucketEntries(board);
|
|
311
|
+
return listed.map((entry) => entry.bucket);
|
|
312
|
+
}
|
|
313
|
+
async function listedBucketEntries(board) {
|
|
308
314
|
try {
|
|
309
315
|
const index = await board.sitemap();
|
|
310
|
-
const published = new
|
|
311
|
-
|
|
316
|
+
const published = new Map(
|
|
317
|
+
index.buckets.map((entry) => [entry.bucket, entry.lastModified])
|
|
318
|
+
);
|
|
319
|
+
return SITEMAP_BUCKETS.filter((bucket) => published.has(bucket)).map(
|
|
320
|
+
(bucket) => {
|
|
321
|
+
const lastModified = published.get(bucket);
|
|
322
|
+
return lastModified === void 0 ? { bucket } : { bucket, lastModified };
|
|
323
|
+
}
|
|
324
|
+
);
|
|
312
325
|
} catch (error) {
|
|
313
326
|
if (!isNotFound(error)) throw error;
|
|
314
327
|
const { features } = await board.context();
|
|
315
|
-
return SITEMAP_BUCKETS.filter((b) => b !== "blog" || features.blog)
|
|
328
|
+
return SITEMAP_BUCKETS.filter((b) => b !== "blog" || features.blog).map(
|
|
329
|
+
(bucket) => ({ bucket })
|
|
330
|
+
);
|
|
316
331
|
}
|
|
317
332
|
}
|
|
318
333
|
async function buildBucketUrls(board, origin, bucket) {
|
|
334
|
+
const entries = await buildBucketEntries(board, origin, bucket);
|
|
335
|
+
return entries.map((entry) => entry.url);
|
|
336
|
+
}
|
|
337
|
+
async function buildBucketEntries(board, origin, bucket) {
|
|
319
338
|
try {
|
|
320
|
-
return await
|
|
339
|
+
return await mirrorBucketEntries(board, origin, bucket);
|
|
321
340
|
} catch (error) {
|
|
322
341
|
if (!isNotFound(error)) throw error;
|
|
323
|
-
|
|
342
|
+
const urls = await legacyBucketUrls(board, origin, bucket);
|
|
343
|
+
return urls.map((url) => ({ url }));
|
|
324
344
|
}
|
|
325
345
|
}
|
|
326
|
-
async function
|
|
346
|
+
async function mirrorBucketEntries(board, origin, bucket) {
|
|
327
347
|
const pages = paginate(
|
|
328
348
|
(query, options) => board.sitemap.entries(bucket, query, options),
|
|
329
349
|
{ limit: MIRROR_PAGE }
|
|
330
350
|
).pages();
|
|
331
|
-
const
|
|
351
|
+
const entries = [];
|
|
332
352
|
for await (const page of pages) {
|
|
333
|
-
for (const entry of page.data)
|
|
353
|
+
for (const entry of page.data) {
|
|
354
|
+
const url = `${origin}${entry.path}`;
|
|
355
|
+
entries.push(
|
|
356
|
+
entry.lastModified === void 0 ? { url } : { url, lastModified: entry.lastModified }
|
|
357
|
+
);
|
|
358
|
+
}
|
|
334
359
|
}
|
|
335
|
-
return
|
|
360
|
+
return entries;
|
|
336
361
|
}
|
|
337
362
|
async function legacyBucketUrls(board, origin, bucket) {
|
|
338
363
|
switch (bucket) {
|
package/dist/sitemap.mjs
CHANGED
|
@@ -178,34 +178,57 @@ function enumerateCompanies(board) {
|
|
|
178
178
|
}
|
|
179
179
|
var MIRROR_PAGE = 1e3;
|
|
180
180
|
async function listedBuckets(board) {
|
|
181
|
+
const listed = await listedBucketEntries(board);
|
|
182
|
+
return listed.map((entry) => entry.bucket);
|
|
183
|
+
}
|
|
184
|
+
async function listedBucketEntries(board) {
|
|
181
185
|
try {
|
|
182
186
|
const index = await board.sitemap();
|
|
183
|
-
const published = new
|
|
184
|
-
|
|
187
|
+
const published = new Map(
|
|
188
|
+
index.buckets.map((entry) => [entry.bucket, entry.lastModified])
|
|
189
|
+
);
|
|
190
|
+
return SITEMAP_BUCKETS.filter((bucket) => published.has(bucket)).map(
|
|
191
|
+
(bucket) => {
|
|
192
|
+
const lastModified = published.get(bucket);
|
|
193
|
+
return lastModified === void 0 ? { bucket } : { bucket, lastModified };
|
|
194
|
+
}
|
|
195
|
+
);
|
|
185
196
|
} catch (error) {
|
|
186
197
|
if (!isNotFound(error)) throw error;
|
|
187
198
|
const { features } = await board.context();
|
|
188
|
-
return SITEMAP_BUCKETS.filter((b) => b !== "blog" || features.blog)
|
|
199
|
+
return SITEMAP_BUCKETS.filter((b) => b !== "blog" || features.blog).map(
|
|
200
|
+
(bucket) => ({ bucket })
|
|
201
|
+
);
|
|
189
202
|
}
|
|
190
203
|
}
|
|
191
204
|
async function buildBucketUrls(board, origin, bucket) {
|
|
205
|
+
const entries = await buildBucketEntries(board, origin, bucket);
|
|
206
|
+
return entries.map((entry) => entry.url);
|
|
207
|
+
}
|
|
208
|
+
async function buildBucketEntries(board, origin, bucket) {
|
|
192
209
|
try {
|
|
193
|
-
return await
|
|
210
|
+
return await mirrorBucketEntries(board, origin, bucket);
|
|
194
211
|
} catch (error) {
|
|
195
212
|
if (!isNotFound(error)) throw error;
|
|
196
|
-
|
|
213
|
+
const urls = await legacyBucketUrls(board, origin, bucket);
|
|
214
|
+
return urls.map((url) => ({ url }));
|
|
197
215
|
}
|
|
198
216
|
}
|
|
199
|
-
async function
|
|
217
|
+
async function mirrorBucketEntries(board, origin, bucket) {
|
|
200
218
|
const pages = paginate(
|
|
201
219
|
(query, options) => board.sitemap.entries(bucket, query, options),
|
|
202
220
|
{ limit: MIRROR_PAGE }
|
|
203
221
|
).pages();
|
|
204
|
-
const
|
|
222
|
+
const entries = [];
|
|
205
223
|
for await (const page of pages) {
|
|
206
|
-
for (const entry of page.data)
|
|
224
|
+
for (const entry of page.data) {
|
|
225
|
+
const url = `${origin}${entry.path}`;
|
|
226
|
+
entries.push(
|
|
227
|
+
entry.lastModified === void 0 ? { url } : { url, lastModified: entry.lastModified }
|
|
228
|
+
);
|
|
229
|
+
}
|
|
207
230
|
}
|
|
208
|
-
return
|
|
231
|
+
return entries;
|
|
209
232
|
}
|
|
210
233
|
async function legacyBucketUrls(board, origin, bucket) {
|
|
211
234
|
switch (bucket) {
|
|
@@ -354,8 +377,10 @@ export {
|
|
|
354
377
|
SITEMAP_BUCKETS,
|
|
355
378
|
SITEMAP_CHUNK_SIZE,
|
|
356
379
|
bucketFilename,
|
|
380
|
+
buildBucketEntries,
|
|
357
381
|
buildBucketUrls,
|
|
358
382
|
chunk,
|
|
383
|
+
listedBucketEntries,
|
|
359
384
|
listedBuckets,
|
|
360
385
|
parseBucketFilename,
|
|
361
386
|
renderSitemapIndex,
|
package/package.json
CHANGED
|
@@ -18,7 +18,10 @@ The pure XML tier exports `SITEMAP_BUCKETS`, `SITEMAP_CHUNK_SIZE` (45,000),
|
|
|
18
18
|
`chunk`, `bucketFilename`, `parseBucketFilename`, `renderUrlset`, and
|
|
19
19
|
`renderSitemapIndex`. The catalog tier exports `listedBuckets(board)` and
|
|
20
20
|
`buildBucketUrls(board, origin, bucket)`; it walks the SDK and applies the
|
|
21
|
-
hosted indexing policy.
|
|
21
|
+
hosted indexing policy. `listedBucketEntries(board)` and
|
|
22
|
+
`buildBucketEntries(board, origin, bucket)` are the freshness-preserving
|
|
23
|
+
siblings: same walk and same policy, but each result keeps its
|
|
24
|
+
`lastModified`.
|
|
22
25
|
|
|
23
26
|
## Serve the index
|
|
24
27
|
|
|
@@ -77,9 +80,55 @@ return xmlResponse(renderUrlset(page));
|
|
|
77
80
|
serialize to ISO 8601. `renderSitemapIndex` accepts strings or
|
|
78
81
|
`{ url, lastModified? }`. The hosted format omits `changefreq` and `priority`.
|
|
79
82
|
|
|
83
|
+
## Emit `<lastmod>`
|
|
84
|
+
|
|
85
|
+
Freshness is the strongest recrawl-priority signal on a large sitemap, so
|
|
86
|
+
prefer the entries walkers. `buildBucketEntries` returns
|
|
87
|
+
`{ url, lastModified? }[]` that feeds `renderUrlset` unchanged, and
|
|
88
|
+
`listedBucketEntries` returns `{ bucket, lastModified? }[]` for the index.
|
|
89
|
+
The board publishes a stamp per URL and per bucket wherever it tracks one;
|
|
90
|
+
entries without one simply omit `<lastmod>`.
|
|
91
|
+
|
|
92
|
+
```ts snippet
|
|
93
|
+
import {
|
|
94
|
+
SITEMAP_CHUNK_SIZE,
|
|
95
|
+
buildBucketEntries,
|
|
96
|
+
bucketFilename,
|
|
97
|
+
chunk,
|
|
98
|
+
listedBucketEntries,
|
|
99
|
+
renderSitemapIndex,
|
|
100
|
+
renderUrlset,
|
|
101
|
+
type SitemapIndexEntry,
|
|
102
|
+
} from '@cavuno/board/sitemap';
|
|
103
|
+
|
|
104
|
+
// Index: one <sitemap> per chunk, each carrying its bucket's stamp. Buckets
|
|
105
|
+
// over SITEMAP_CHUNK_SIZE produce -2, -3, … files; list every one.
|
|
106
|
+
const sitemaps: SitemapIndexEntry[] = [];
|
|
107
|
+
for (const { bucket, lastModified } of await listedBucketEntries(board)) {
|
|
108
|
+
const chunks = chunk(await buildBucketEntries(board, origin, bucket), SITEMAP_CHUNK_SIZE);
|
|
109
|
+
for (let i = 0; i < Math.max(chunks.length, 1); i += 1) {
|
|
110
|
+
sitemaps.push({
|
|
111
|
+
url: `${origin}/sitemap/${bucketFilename(bucket, i)}`,
|
|
112
|
+
...(lastModified ? { lastModified } : {}),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const indexXml = renderSitemapIndex(sitemaps);
|
|
117
|
+
|
|
118
|
+
// Bucket file: every <url> keeps its own stamp.
|
|
119
|
+
const entries = await buildBucketEntries(board, origin, parsed.bucket);
|
|
120
|
+
const page = chunk(entries, SITEMAP_CHUNK_SIZE)[parsed.chunkIndex] ?? [];
|
|
121
|
+
const bucketXml = renderUrlset(page);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`buildBucketUrls` and `listedBuckets` still return plain strings and bucket
|
|
125
|
+
names; they are unchanged, and a sitemap built from them carries no
|
|
126
|
+
`<lastmod>`.
|
|
127
|
+
|
|
80
128
|
## Keep the walker policy intact
|
|
81
129
|
|
|
82
|
-
`
|
|
130
|
+
`buildBucketEntries` is the policy boundary (`buildBucketUrls` is a map over
|
|
131
|
+
it):
|
|
83
132
|
|
|
84
133
|
- Taxonomy and location pages enter the sitemap at five distinct jobs,
|
|
85
134
|
`MIN_JOBS_PER_INDEXED_PAGE`.
|
package/skills/manifest.json
CHANGED