@cavuno/board 4.3.1 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
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.4.1 — 2026-08-10
7
+
8
+ - **SDK installation documentation**: The npm and GitHub README now presents
9
+ package installation as the recommended TypeScript SDK path, with CDN
10
+ installation as a separate option for static HTML and other no-build sites.
11
+ Links point to the canonical SDK installation guides on cavuno.com.
12
+
13
+ ## 4.4.0 — 2026-08-10
14
+
15
+ - **Classic-script browser build**: `@cavuno/board` now ships a dependency-free
16
+ ES2020 IIFE at `dist/browser/cavuno-board.global.min.js` for static HTML,
17
+ CMS, and other no-build integrations. It installs `globalThis.CavunoBoard`
18
+ with the complete root client plus the browser-safe `format`, `filters`,
19
+ `suggest`, `seo`, and `paths` namespaces. Existing ESM and CommonJS entries
20
+ are unchanged; use ESM subpaths when tree-shaking matters. Production script
21
+ tags should pin 4.4.0 exactly and use the release SHA-384 integrity value.
22
+ - **Automation job lifecycle events**: Zapier exposes separate job-created,
23
+ job-updated, and job-deleted triggers. Created and updated events carry the
24
+ allowlisted job snapshot, including HTML `description` and the public job
25
+ `url`; deleted events carry the minimal tombstone required to remove a
26
+ downstream copy.
27
+
6
28
  ## 4.3.1 — 2026-08-07
7
29
 
8
30
  - **Public blog authors: `location` and `facebookUrl`**: list, retrieve, and
package/README.md CHANGED
@@ -2,114 +2,130 @@
2
2
 
3
3
  Build custom job boards and careers pages with Cavuno’s TypeScript SDK.
4
4
 
5
- `@cavuno/board` is a typed, isomorphic client for the
6
- [Cavuno job board platform](https://cavuno.com) Board API. It has zero runtime
7
- dependencies and runs in browsers, Node.js 20 or newer, and Cloudflare Workers.
5
+ `@cavuno/board` is the zero-dependency client for the Cavuno Board API. It
6
+ runs in browsers, Node.js 20 or newer, and Cloudflare Workers, with TypeScript
7
+ declarations generated from the API’s OpenAPI contract.
8
8
 
9
- You bring the framework and own the layout; the SDK brings the job board:
10
- jobs and search, companies, salaries, blog, board-user auth, saved jobs,
11
- applications, job alerts, messaging, employer self-service, checkout, and
12
- the candidate paywall — every method typed from the API's own OpenAPI
13
- contract.
9
+ [Documentation](https://cavuno.com/docs/sdk) ·
10
+ [Installing](https://cavuno.com/docs/sdk/installing) ·
11
+ [SDK reference](https://cavuno.com/docs/sdk/reference) ·
12
+ [API reference](https://cavuno.com/docs/api) ·
13
+ [Source](https://github.com/wollemiahq/cavuno-sdk)
14
14
 
15
- ## Building with a coding agent
15
+ ## Installation
16
16
 
17
- The package ships an Agent Skills corpus for Codex, Claude Code, Cursor, and
18
- other compatible coding agents. It teaches them how to wire a board correctly — client setup,
19
- auth and session ownership, pagination, gating, error handling, and a
20
- runtime smoke test:
21
-
22
- Install the latest skills directly from the public SDK repository:
17
+ ### Install as package
23
18
 
24
19
  ```bash
25
- npx skills add wollemiahq/cavuno-sdk --skill cavuno-board-setup
26
- # Or install the complete Cavuno skill set:
27
- npx skills add wollemiahq/cavuno-sdk --skill '*'
20
+ npm install @cavuno/board
28
21
  ```
29
22
 
30
- For skills matched exactly to an installed SDK version, copy them from the
31
- package instead:
23
+ The package includes ESM and CommonJS builds. ESM imports are tree-shakeable,
24
+ and helper packages such as `@cavuno/board/format` can be imported separately.
32
25
 
33
- ```bash
34
- npm install @cavuno/board # or: pnpm add / yarn add / bun add
35
- npx @cavuno/board setup # copies version-matched Agent Skills
36
- ```
26
+ ### Install via CDN
27
+
28
+ No package manager or build step? Follow the
29
+ [CDN installation guide](https://cavuno.com/docs/sdk/installing/cdn)
30
+ for a version-pinned build and its integrity hash. The CDN build is
31
+ the same SDK downloaded as one file; package imports remain the recommended
32
+ choice when they are available.
37
33
 
38
- Then ask your agent: *"set up my Cavuno board"* — it reads the
39
- `cavuno-board-setup` skill and works surface by surface. Because the
40
- skills live in your project and match your installed version, the agent
41
- never works from stale docs.
34
+ See [Installing](https://cavuno.com/docs/sdk/installing) for every installation option.
42
35
 
43
- ## Quick start (by hand)
36
+ ## Quick start
44
37
 
45
38
  ```ts
46
39
  import { createBoardClient } from '@cavuno/board';
47
40
 
48
41
  const board = createBoardClient({
49
- board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
42
+ board: 'pk_your_publishable_key',
50
43
  });
51
44
 
52
- const { name, language, features } = await board.context();
53
- const page = await board.jobs.list({ limit: 20 });
54
- const job = await board.jobs.retrieve('senior-chef');
45
+ const [context, jobs] = await Promise.all([
46
+ board.context(),
47
+ board.jobs.list({ limit: 20 }),
48
+ ]);
55
49
 
56
- // Federated search-dropdown suggestions (companies, markets, taxonomy terms).
57
- const { items } = await board.search.suggest({
58
- q: 'acme',
59
- limit: 10,
60
- types: ['company', 'skill'],
61
- });
62
- // Or the headless controller (debounce / abort / stale-drop built in):
63
- // import { createSuggestController } from '@cavuno/board/suggest';
64
- // const suggest = createSuggestController(board);
65
- // suggest.setQuery('acme');
50
+ console.log(context.name);
51
+ console.log(jobs.data);
66
52
  ```
67
53
 
68
- Every method accepts trailing `FetchOptions` — `signal`, `headers`, and
69
- framework caching directives (`next: { tags }`, `cf: {…}`) pass through to
70
- `fetch` untouched. Walk full catalogs with the async iterator:
54
+ A `pk_…` key identifies a board and is public by design. Get it from
55
+ **Settings → Developer → SDK** in Cavuno. The client connects to
56
+ `https://api.cavuno.com` by default.
71
57
 
72
- ```ts
73
- import { paginate } from '@cavuno/board';
58
+ The client exposes typed namespaces for jobs and search, companies, salaries,
59
+ blog, board-user authentication, saved jobs, applications, job alerts,
60
+ messaging, employer workflows, checkout, candidate access, and SEO data.
61
+
62
+ ## Handle errors
63
+
64
+ Every non-2xx response throws a `BoardApiError` with the API status, code,
65
+ details, and request ID.
74
66
 
75
- // the query `limit` is the page size; toArray's `limit` caps items collected
76
- for await (const card of paginate(board.jobs.list, { limit: 100 })) {
77
- urls.push(card.links.public);
67
+ ```ts
68
+ import { BoardApiError, isNotFound } from '@cavuno/board';
69
+
70
+ try {
71
+ await board.jobs.retrieve('missing-job');
72
+ } catch (error) {
73
+ if (isNotFound(error)) {
74
+ // Render your application's not-found state.
75
+ } else if (error instanceof BoardApiError) {
76
+ console.error(error.code, error.requestId);
77
+ }
78
78
  }
79
- const first500 = await paginate(board.companies.list, { limit: 100 })
80
- .toArray({ limit: 500 });
81
79
  ```
82
80
 
83
- Errors are typed — every non-2xx throws a `BoardApiError` carrying the full
84
- v1 envelope (`status`, `code`, `details`, `requestId`), with guards like
85
- `isNotFound`, `isRateLimited`, and `isBoardPasswordRequired`.
81
+ See [Handle SDK errors](https://cavuno.com/docs/sdk/fundamentals/errors) for
82
+ the complete error contract and guards.
83
+
84
+ ## Authentication
85
+
86
+ - A `pk_…` publishable key identifies the board and may be included in browser
87
+ code.
88
+ - Candidate and employer sessions use `board.auth.*`. Choose browser storage
89
+ deliberately; server-rendered applications should keep sessions in their
90
+ own httpOnly cookies.
91
+ - Operator and admin credentials must never be used with this SDK or exposed
92
+ to frontend code.
93
+
94
+ Read [Authentication and sessions](https://cavuno.com/docs/sdk/fundamentals/authentication-and-session-ownership)
95
+ before adding signed-in workflows.
86
96
 
87
- ## Auth model
97
+ ## Make a request to a custom endpoint
88
98
 
89
- Three tiers, safe for browsers by construction:
99
+ For an endpoint without a namespace method, `board.client.fetch<T>(path, init)`
100
+ uses the same board base path, headers, bearer token, serialization, and hooks
101
+ as the rest of the client. Treat the generic response type as your
102
+ application’s assertion; custom responses are not generated from the public
103
+ OpenAPI contract.
90
104
 
91
- - **`pk_…` publishable key** — identifies the board; public by design.
92
- - **Board-user JWT** — candidate/employer sessions via `board.auth.*`.
93
- Pluggable storage (`memory` in the browser, `nostore` on the server);
94
- on SSR, keep the session in an httpOnly cookie your app owns and pass
95
- the token per call. No auto-refresh on 401 — rotation is explicit.
96
- - **No secret keys** — operator/admin credentials never touch this SDK.
105
+ See [`board.client.fetch()`](https://cavuno.com/docs/sdk/reference/top-level-methods#make-a-request-to-a-custom-endpoint)
106
+ for options and examples.
97
107
 
98
- ## Escape hatch
108
+ ## Set up with a coding agent
109
+
110
+ The package includes version-matched Agent Skills for Codex, Claude Code,
111
+ Cursor, and other compatible coding agents:
112
+
113
+ ```bash
114
+ npx @cavuno/board setup
115
+ ```
99
116
 
100
- `board.client.fetch<T>(path, init)` sends a typed request through the full
101
- pipeline (board base path, headers, bearer token, hooks) for endpoints the
102
- SDK doesn't cover yet.
117
+ Then ask your agent to set up the Cavuno board using the installed
118
+ `cavuno-board-setup` skill. See
119
+ [Set up with an agent](https://cavuno.com/docs/sdk/installing/agent)
120
+ for the review and verification workflow.
103
121
 
104
- ## Docs
122
+ ## Resources
105
123
 
106
- - Cavuno: <https://cavuno.com>
107
- - SDK guides and reference: <https://cavuno.com/docs/sdk>
108
- - API documentation: <https://cavuno.com/docs/api>
109
- - OpenAPI document: `GET https://api.cavuno.com/v1/openapi.json`
110
- - Source: <https://github.com/wollemiahq/cavuno-sdk>
111
- - Issues: <https://github.com/wollemiahq/cavuno-sdk/issues>
112
- - Clone-and-own TanStack Start + shadcn/ui template:
113
- <https://github.com/wollemiahq/cavuno-tanstack-start-shadcn-job-board-template>
124
+ - [SDK guides and reference](https://cavuno.com/docs/sdk)
125
+ - [Board API documentation](https://cavuno.com/docs/api)
126
+ - [OpenAPI document](https://api.cavuno.com/v1/openapi.json)
127
+ - [Source](https://github.com/wollemiahq/cavuno-sdk)
128
+ - [Issues](https://github.com/wollemiahq/cavuno-sdk/issues)
129
+ - [TanStack Start + shadcn/ui job board template](https://github.com/wollemiahq/cavuno-tanstack-start-shadcn-job-board-template)
114
130
 
115
131
  MIT © Wollemia
@@ -0,0 +1 @@
1
+ "use strict";var CavunoBoard=(()=>{var M=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var Dt=(e,t,o)=>t in e?M(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var L=(e,t)=>{for(var o in t)M(e,o,{get:t[o],enumerable:!0})},$t=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of wt(t))!Nt.call(e,r)&&r!==o&&M(e,r,{get:()=>t[r],enumerable:!(n=Mt(t,r))||n.enumerable});return e};var jt=e=>$t(M({},"__esModule",{value:!0}),e);var E=(e,t,o)=>Dt(e,typeof t!="symbol"?t+"":t,o);var Mo={};L(Mo,{ACCESS_TOKEN_KEY:()=>_,BOARD_ACCESS_GRANT_KEY:()=>x,BOARD_API_ERROR_CODES:()=>ce,BoardApiError:()=>A,BoardClient:()=>F,REFRESH_TOKEN_KEY:()=>T,SDK_VERSION:()=>w,createBoardClient:()=>Yt,filters:()=>X,format:()=>ae,isBoardApiError:()=>P,isBoardPasswordRequired:()=>de,isColdRule:()=>Ge,isConflict:()=>he,isForbidden:()=>ye,isNotFound:()=>ue,isOwnMessage:()=>qe,isRateLimited:()=>fe,isSafeApplicationUrl:()=>Z,isUnauthorized:()=>me,isValidationError:()=>ge,lastOwnMessageId:()=>He,paginate:()=>Qe,paths:()=>se,resolveApplyAction:()=>Ve,seo:()=>le,suggest:()=>pe});var ce=["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_email_taken","board_auth_invalid_credentials","board_auth_invalid_token","board_auth_registration_disabled","board_auth_token_expired","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_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","resume_invalid_file","resume_upload_forbidden","applications_external_apply_only","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_company_name_taken","employer_company_not_found","employer_job_not_found","employer_job_slug_taken","employer_jobs_quota_exceeded","employer_not_member","employer_payment_required","employer_pipeline_stage_not_found","paywall_already_active","paywall_disabled","paywall_invalid_checkout_session","paywall_no_candidate_profile","paywall_no_recurring_subscription","paywall_offer_not_found","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 P(e){return e instanceof Error&&e.name==="BoardApiError"&&typeof e.status=="number"&&typeof e.code=="string"}function ue(e){return P(e)&&e.status===404}function me(e){return P(e)&&e.status===401}function de(e){return P(e)&&e.status===401&&e.code==="board_password_required"}function ye(e){return P(e)&&e.status===403}function ge(e){return P(e)&&e.status===400&&e.code==="validation_bad_request"}function fe(e){return P(e)&&e.status===429}function he(e){return P(e)&&e.status===409}function be(e){let t=new URLSearchParams;if(!e)return t;for(let[o,n]of Object.entries(e))if(n!=null)if(Array.isArray(n))for(let r of n)r!=null&&t.append(o,String(r));else t.append(o,String(n));return t}function Se(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t+e.charCodeAt(n)>>>0;return`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}-${t.toString(36)}`}var _="cavuno_board_access_token",T="cavuno_board_refresh_token",x="cavuno_board_access_grant";function Ce(){return typeof globalThis.document<"u"}function Qt(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,o)=>{e.set(t,o)},removeItem:t=>{e.delete(t)}}}function qt(e,t){if(!Ce())throw new Error(`storage mode '${e}' is browser-only \u2014 use 'nostore' + per-call headers on the server`);let o;try{if(o=e==="local"?globalThis.localStorage:globalThis.sessionStorage,!o)throw new Error("unavailable")}catch{throw new Error(`storage mode '${e}' is unavailable in this browsing context (storage access is blocked \u2014 e.g. a sandboxed or third-party iframe). Use 'memory', or 'nostore' + per-call headers.`)}let n=t?`:${Se(t)}`:"";return{getItem:r=>o.getItem(`${r}${n}`),setItem:(r,i)=>{o.setItem(`${r}${n}`,i)},removeItem:r=>{o.removeItem(`${r}${n}`)}}}var Gt=Symbol.for("@cavuno/board:nostore");var Ht={[Gt]:!0,getItem:()=>null,setItem:()=>{},removeItem:()=>{}};function Oe(e,t){let o=e??(Ce()?"memory":"nostore");if(typeof o=="object")return o;switch(o){case"memory":return Qt();case"nostore":return Ht;case"local":case"session":return qt(o,t);default:throw new Error(`Unknown storage mode '${String(o)}'`)}}async function Ee(e,t){await e.setItem(_,t.accessToken),await e.setItem(T,t.refreshToken)}async function Pe(e){await e.removeItem(_),await e.removeItem(T)}var w="4.4.1";function Vt(e){return typeof e=="string"||e instanceof URLSearchParams||typeof FormData<"u"&&e instanceof FormData||typeof Blob<"u"&&e instanceof Blob||e instanceof ArrayBuffer||typeof ReadableStream<"u"&&e instanceof ReadableStream}function Kt(e){try{let t=new URL(e);for(let o of new Set(t.searchParams.keys()))t.searchParams.delete(o),t.searchParams.set(o,"[REDACTED]");return t.toString()}catch{return e.replace(/([?&][^=&#]+)=([^&#]*)/g,"$1=[REDACTED]")}}var F=class{constructor(t){E(this,"storage");E(this,"basePath");E(this,"options");this.options=t,this.storage=t.storage;let o=t.baseUrl.replace(/\/+$/,"");this.basePath=`${o}/v1/boards/${encodeURIComponent(t.board)}`}async fetch(t,o={}){let{body:n,query:r,headers:i,...s}=o,a=(o.method??"GET").toUpperCase(),p=`${this.basePath}${t}`,u=be(r).toString();u&&(p+=`?${u}`);let d=n!==void 0&&!Vt(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[B,W]of Object.entries(this.options.globalHeaders??{}))y.set(B,W);let g=await this.storage.getItem(_);g!==null&&y.set("authorization",`Bearer ${g}`);let C=await this.storage.getItem(x);C!==null&&y.set("x-board-access",C),i&&new Headers(i).forEach((B,W)=>{y.set(W,B)}),(a!=="GET"||y.has("authorization")||y.has("x-board-access"))&&!y.has("x-cavuno-sdk")&&y.set("x-cavuno-sdk",`board@${w}`);let f={url:p,init:{...s,method:a,headers:y,body:m}};this.options.onRequest&&(f=await this.options.onRequest(f));let R=Kt(f.url);this.options.logger?.debug(`${a} ${R}`);let c=await globalThis.fetch(f.url,f.init);if(this.options.logger?.debug(`${c.status} ${a} ${R}`),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,v=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(`${v.status} ${v.code} ${a} ${R}`),v}};var Re="https://api.cavuno.com";function Be(e){async function t(n){return await Ee(e.storage,n),n}async function o(n){if(n?.refreshToken)return n.refreshToken;let r=await e.storage.getItem(T);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 e.fetch("/auth/register",{...r,method:"POST",body:n});return t(i)},async login(n,r){let i=await e.fetch("/auth/login",{...r,method:"POST",body:n});return t(i)},async refresh(n,r){let i=await o(n),s=await e.fetch("/auth/refresh",{...r,method:"POST",body:{refreshToken:i}});return t(s)},async logout(n,r){let i=await o(n);await e.fetch("/auth/logout",{...r,method:"POST",body:{refreshToken:i}}),await Pe(e.storage)},verifyEmail(n,r){return e.fetch("/auth/verify-email",{...r,method:"POST",body:n})},verifyEmailWithCode(n,r){return e.fetch("/auth/verify-email/otp",{...r,method:"POST",body:n})},resendVerification(n){return e.fetch("/auth/verify-email/resend",{...n,method:"POST"})},forgotPassword(n,r){return e.fetch("/auth/forgot-password",{...r,method:"POST",body:n})},resetPassword(n,r){return e.fetch("/auth/reset-password",{...r,method:"POST",body:n})},requestMagicLink(n,r){return e.fetch("/auth/magic-link",{...r,method:"POST",body:n})},async consumeMagicLink(n,r){let i=await e.fetch("/auth/magic-link/consume",{...r,method:"POST",body:n});return t(i)},getOAuthAuthorizationUrl(n,r,i){return e.fetch(`/auth/oauth/${n}`,{...i,method:"GET",query:r})},async exchangeOAuth(n,r){let i=await e.fetch("/auth/oauth/exchange",{...r,method:"POST",body:n});return t(i)}}}function Ae(e){return{posts:{list(t,o){return e.fetch("/blog/posts",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}`,{...n,query:o})},adjacent(t,o){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/adjacent`,o)},similar(t,o,n){return e.fetch(`/blog/posts/${encodeURIComponent(t)}/similar`,{...n,query:o})}},tags:{list(t,o){return e.fetch("/blog/tags",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/tags/${encodeURIComponent(t)}`,{...n,query:o})}},authors:{list(t,o){return e.fetch("/blog/authors",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/blog/authors/${encodeURIComponent(t)}`,{...n,query:o})}},search(t,o,n){return e.fetch("/blog/search",{...n,method:"POST",body:t,query:o})}}}function ve(e){let t=Object.assign((n,r)=>e.fetch("/companies/markets",{...r,query:n}),{resolve(n,r){return e.fetch(`/companies/markets/${encodeURIComponent(n)}`,r)}}),o=Object.assign((n,r)=>e.fetch(`/companies/${encodeURIComponent(n)}/salaries`,r),{summary(n,r){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/summary`,r)},category(n,r,i,s){return e.fetch(`/companies/${encodeURIComponent(n)}/salaries/${encodeURIComponent(r)}`,{...s,query:i})}});return{list(n,r){return e.fetch("/companies",{...r,query:n})},retrieve(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}`,{...i,query:r})},search(n,r,i){return e.fetch("/companies/search",{...i,method:"POST",body:n,query:r})},listJobs(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/jobs`,{...i,query:r})},similar(n,r,i){return e.fetch(`/companies/${encodeURIComponent(n)}/similar`,{...i,query:r})},markets:t,salaries:o}}function Le(e){return{jobs(t,o){return e.fetch("/embed/jobs",{...o,query:t})}}}function _e(e){return{subscribe(t,o){return e.fetch("/job-alerts",{...o,method:"POST",body:t})},confirm(t,o){return e.fetch("/job-alerts/confirm",{...o,method:"POST",body:t})},resendConfirmation(t,o){return e.fetch("/job-alerts/resend-confirmation",{...o,method:"POST",body:t})},manage(t,o){return e.fetch("/job-alerts/manage",{...o,query:t})},unsubscribe(t,o){return e.fetch("/job-alerts/unsubscribe",{...o,method:"POST",body:t})},resubscribe(t,o){return e.fetch("/job-alerts/resubscribe",{...o,method:"POST",body:t})},updatePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"POST",body:t})},deletePreference(t,o){return e.fetch("/job-alerts/preferences",{...o,method:"DELETE",body:t})}}}function Te(e){return{plans(t,o){return e.fetch("/job-postings/plans",{...o,query:t})},create(t,o){return e.fetch("/job-postings",{...o,method:"POST",body:t})},uploadLogo(t,o){let n=new FormData;return n.append("file",t),e.fetch("/job-postings/logo",{...o,method:"POST",body:n})},fetchLogoByDomain(t,o){return e.fetch("/job-postings/logo/fetch",{...o,query:{domain:t}})},sendBillingVerification(t,o){return e.fetch("/job-postings/send-verification",{...o,method:"POST",body:t})},getBillingOptions(t,o){return e.fetch("/job-postings/billing-options",{...o,method:"POST",body:t})}}}function xe(e){return{list(t,o){return e.fetch("/jobs",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}`,{...n,query:o})},search(t,o,n){return e.fetch("/jobs/search",{...n,method:"POST",body:t,query:o})},similar(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/similar`,{...n,query:o})},apply(t,o,n){return e.fetch(`/jobs/${encodeURIComponent(t)}/apply`,{...n,method:"POST",body:o??{}})},uploadApplicationResume(t,o,n,r){let i=new FormData;return i.append("file",o),n?.applicationId&&i.append("applicationId",n.applicationId),e.fetch(`/jobs/${encodeURIComponent(t)}/apply/resume`,{...r,method:"POST",body:i})},myApplication(t,o){return e.fetch(`/jobs/${encodeURIComponent(t)}/application`,o)}}}function Fe(e){return{retrieve(t,o){return e.fetch("/me",{...o,query:t})},delete(t){return e.fetch("/me",{...t,method:"DELETE"})},profile:{retrieve(t,o){return e.fetch("/me/profile",{...o,query:t})},update(t,o,n){return e.fetch("/me/profile",{...n,method:"PATCH",body:t,query:o})},handleAvailable(t,o){return e.fetch("/me/profile/handle-available",{...o,query:{handle:t}})},listExperience(t){return e.fetch("/me/profile/experience",t)},createExperience(t,o){return e.fetch("/me/profile/experience",{...o,method:"POST",body:t})},updateExperience(t,o,n){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteExperience(t,o){return e.fetch(`/me/profile/experience/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listEducation(t){return e.fetch("/me/profile/education",t)},createEducation(t,o){return e.fetch("/me/profile/education",{...o,method:"POST",body:t})},updateEducation(t,o,n){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},deleteEducation(t,o){return e.fetch(`/me/profile/education/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},listSkills(t){return e.fetch("/me/profile/skills",t)},updateSkills(t,o){return e.fetch("/me/profile/skills",{...o,method:"PUT",body:t})},listLanguages(t){return e.fetch("/me/profile/languages",t)},updateLanguages(t,o){return e.fetch("/me/profile/languages",{...o,method:"PUT",body:t})},uploadAvatar(t,o){let n=new FormData;return n.append("file",t),e.fetch("/me/profile/avatar",{...o,method:"POST",body:n})}},notificationPreferences:{retrieve(t){return e.fetch("/me/notification-preferences",t)},update(t,o){return e.fetch("/me/notification-preferences",{...o,method:"PUT",body:t})},unsubscribeWithToken(t,o){return e.fetch("/me/notification-preferences/unsubscribe",{...o,method:"POST",body:t})}},companies:{search(t,o){return e.fetch("/me/companies/search",{...o,query:t})},list(t){return e.fetch("/me/companies",t)},create(t,o){return e.fetch("/me/companies",{...o,method:"POST",body:t})},claim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"POST"})},cancelClaim(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/claim`,{...o,method:"DELETE"})},retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},uploadLogo(t,o,n){let r=new FormData;return r.append("file",o),e.fetch(`/me/companies/${encodeURIComponent(t)}/logo`,{...n,method:"POST",body:r})},workEmail:{verify(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/verify`,{...n,method:"POST",body:o})},confirm(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/work-email/confirm`,{...n,method:"POST",body:o})}},jobs:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,query:o})},retrieve(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,n)},create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},delete(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},publish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/publish`,{...n,method:"POST"})},unpublish(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/unpublish`,{...n,method:"POST"})},checkout(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/jobs/${encodeURIComponent(o)}/checkout`,{...r,method:"POST",body:n})}},billingOptions:{list(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/billing-options`,o)}},jobStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/job-stats/timeseries`,{...n,query:o})}},profileStats:{retrieve(t,o){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats`,o)},timeseries(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/profile-stats/timeseries`,{...n,query:o})}},applicants:{list(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants`,{...n,query:o})},move(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/stage`,{...r,method:"PATCH",body:n})},bulkMove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/move`,{...n,method:"POST",body:o})},bulkReject(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/bulk/reject`,{...n,method:"POST",body:o})},addNote(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/applicants/${encodeURIComponent(o)}/notes`,{...r,method:"POST",body:n})}},pipelineStages:{create(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages`,{...n,method:"POST",body:o})},update(t,o,n,r){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...r,method:"PATCH",body:n})},remove(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/${encodeURIComponent(o)}`,{...n,method:"DELETE"})},reorder(t,o,n){return e.fetch(`/me/companies/${encodeURIComponent(t)}/pipeline-stages/reorder`,{...n,method:"PUT",body:o})}}},talentAccess:{retrieve(t){return e.fetch("/me/talent-access",t)}},alerts:{list(t){return e.fetch("/me/alerts",t)},create(t,o){return e.fetch("/me/alerts",{...o,method:"POST",body:t})},retrieve(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,o)},update(t,o,n){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...n,method:"PUT",body:o})},remove(t,o){return e.fetch(`/me/alerts/${encodeURIComponent(t)}`,{...o,method:"DELETE"})}},applications:{list(t,o){return e.fetch("/me/applications",{...o,query:t})},retrieve(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,o)},updateFacts(t,o,n){return e.fetch(`/me/applications/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},withdraw(t,o){return e.fetch(`/me/applications/${encodeURIComponent(t)}/withdraw`,{...o,method:"POST"})}},resume:{upload(t,o,n){let r=new FormData;return r.append("resume",t),o?.keepResumeOnFile&&r.append("keepResumeOnFile","true"),o?.importMode&&r.append("importMode",o.importMode),o?.confirmReplaceAll&&r.append("confirmReplaceAll","true"),e.fetch("/me/resume",{...n,method:"POST",body:r})},retrieve(t){return e.fetch("/me/resume",t)},delete(t){return e.fetch("/me/resume",{...t,method:"DELETE"})}},savedJobs:{list(t,o){return e.fetch("/me/saved-jobs",{...o,query:t})},save(t,o,n){return e.fetch("/me/saved-jobs",{...n,method:"POST",body:t,query:o})},unsave(t,o,n){return e.fetch(`/me/saved-jobs/${encodeURIComponent(t)}`,{...n,method:"DELETE",query:o})}},conversations:{list(t,o){return e.fetch("/me/conversations",{...o,query:t})},unreadCount(t){return e.fetch("/me/conversations/unread-count",t)},retrieve(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}`,o)},listMessages(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/messages`,{...n,query:o})},start(t,o){return e.fetch("/me/conversations",{...o,method:"POST",body:t})},startAboutApplication(t,o){return e.fetch("/me/conversations/about-application",{...o,method:"POST",body:t})},reply(t,o,n){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/reply`,{...n,method:"POST",body:o})},markRead(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/read`,{...o,method:"POST"})},archive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/archive`,{...o,method:"POST"})},unarchive(t,o){return e.fetch(`/me/conversations/${encodeURIComponent(t)}/unarchive`,{...o,method:"POST"})},findExisting(t,o){return e.fetch("/me/conversations/find-existing",{...o,query:t})}},blocks:{list(t){return e.fetch("/me/blocks",t)},create(t,o){return e.fetch("/me/blocks",{...o,method:"POST",body:t})},remove(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},status(t,o){return e.fetch(`/me/blocks/${encodeURIComponent(t)}`,o)}},messages:{edit(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...n,method:"PATCH",body:o})},unsend(t,o){return e.fetch(`/me/messages/${encodeURIComponent(t)}`,{...o,method:"DELETE"})},report(t,o,n){return e.fetch(`/me/messages/${encodeURIComponent(t)}/report`,{...n,method:"POST",body:o})}},marketingConsent:{retrieve(t){return e.fetch("/me/marketing-consent",t)},grant(t){return e.fetch("/me/marketing-consent/grant",{...t,method:"POST"})},withdraw(t){return e.fetch("/me/marketing-consent/withdraw",{...t,method:"POST"})}},access:{checkout(t,o){return e.fetch("/me/access/checkout",{...o,method:"POST",body:t})},retrieveCheckout(t,o){return e.fetch(`/me/access/checkout/${encodeURIComponent(t)}`,o)},grant(t){return e.fetch("/me/access/grant",t)},portal(t,o){return e.fetch("/me/access/portal",{...o,method:"POST",body:t})}}}}function Ie(e){return{async verify(t,o){let n=await e.fetch("/password/verify",{...o,method:"POST",body:{password:t}});return await e.storage.setItem(x,n.token),n}}}function ke(e){return{offers(t){return e.fetch("/paywall/offers/enabled",t)}}}function Ue(e){return{list(t,o){return e.fetch("/plans",{...o,query:t})},salesLed(t){return e.fetch("/sales-led-plans",t)}}}function Je(e){return{resolve(t,o){return e.fetch("/redirects/resolve",{...o,query:{path:t}})}}}function Me(e){return{companies:{list(t){return e.fetch("/salaries/companies",t)}},titles:{list(t,o){return e.fetch("/salaries/titles",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/titles/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},skills:{list(t,o){return e.fetch("/salaries/skills",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}`,{...n,query:o})},locations(t,o,n){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/locations`,{...n,query:o})},location(t,o,n,r){return e.fetch(`/salaries/skills/${encodeURIComponent(t)}/${encodeURIComponent(o)}`,{...r,query:n})}},locations:{list(t,o){return e.fetch("/salaries/locations",{...o,query:t})},retrieve(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}`,{...n,query:o})},titles(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/titles`,{...n,query:o})},skills(t,o,n){return e.fetch(`/salaries/locations/${encodeURIComponent(t)}/skills`,{...n,query:o})}}}}function we(e){return{suggest(t,o){return e.fetch("/search/suggest",{...o,query:t})}}}function Ne(e){return{list(t,o){return e.fetch("/talent",{...o,query:t})},retrieve(t,o){return e.fetch(`/talent/${encodeURIComponent(t)}`,o)}}}function $e(e,t){return{resolve(o,n){return e.fetch(`/${t}/${encodeURIComponent(o)}`,n)}}}function De(e,t){return{...$e(e,t),list(o,n){return e.fetch(`/${t}`,{...n,query:o})}}}function je(e){return{categories:De(e,"categories"),skills:De(e,"skills"),remotePermits:{list(t){return e.fetch("/remote-permits",t)}},places:{...$e(e,"places"),list(t,o){return e.fetch("/places",{...o,query:t})}}}}function Qe(e,t,o){async function*n(){let r=t;for(;;){let i=await e(r,o);if(yield i,!i.hasMore||i.nextCursor===null)return;let{offset:s,...a}=r??{};r={...a,cursor:i.nextCursor}}}return{pages:n,async*[Symbol.asyncIterator](){for await(let r of n())yield*r.data},async toArray({limit:r}){let i=[];for await(let s of n())if(i.push(...s.data),i.length>=r)break;return i.slice(0,r)}}}function qe(e,t){return e.authorBoardUserId!==t}function Ge(e,t){let o=e.some(r=>r.authorBoardUserId===t);return e.some(r=>r.authorBoardUserId!==t)&&!o}function He(e,t){for(let o=e.length-1;o>=0;o--){let n=e[o];if(n.authorBoardUserId!==t)return n.id}return null}function Z(e){let t=e.replace(/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,"").replace(/[\t\n\r]/g,""),o=/^([a-z][a-z0-9+.-]*):/i.exec(t)?.[1]?.toLowerCase();return o===void 0?!0:o==="http"||o==="https"||o==="mailto"}function Ve(e){return e.applicationUrl&&Z(e.applicationUrl)?{kind:"external",url:e.applicationUrl}:e.jobSlug?e.viewer?e.viewer.emailVerified?e.applied?{kind:"applied"}:{kind:"native",jobSlug:e.jobSlug}:{kind:"verify-email"}:{kind:"sign-in"}:{kind:"none"}}function Yt(e){let t=new F({baseUrl:e.baseUrl??Re,board:e.board,storage:Oe(e.auth?.storage,e.board),globalHeaders:e.globalHeaders,onRequest:e.onRequest,onResponse:e.onResponse,logger:e.logger});return{client:t,context(o){return t.fetch("",o)},seo(o){return t.fetch("/seo",o)},jobs:xe(t),embed:Le(t),companies:ve(t),blog:Ae(t),auth:Be(t),me:Fe(t),password:Ie(t),taxonomy:je(t),search:we(t),redirects:Je(t),jobAlerts:_e(t),jobPosting:Te(t),salaries:Me(t),talent:Ne(t),plans:Ue(t),paywall:ke(t)}}var X={};L(X,{DEFAULT_SORT:()=>zt,EMPLOYMENT_TYPES:()=>Ye,JOB_SORTS:()=>We,REMOTE_OPTIONS:()=>Ke,SENIORITIES:()=>ze,parseCompany:()=>Xe,parseListingFilters:()=>Zt,parseSeniority:()=>Ze});var Ke=["on_site","hybrid","remote"],Ye=["full_time","part_time","contract","internship","temporary"],ze=["entry_level","associate","mid_level","senior","lead","principal","director","executive"],We=["relevance","newest","salary_high"],zt="relevance";var Wt=new Set(ze);function Ze(e){let t=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],o=[],n=new Set;for(let r of t){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");!i||n.has(i)||Wt.has(i)&&(n.add(i),o.push(i))}return o.length>0?o:void 0}function Xe(e){let t=Array.isArray(e)?e:typeof e=="string"&&e?e.split(","):[],o=[],n=new Set;for(let r of t){if(typeof r!="string")continue;let i=r.trim().toLowerCase().normalize("NFC");if(!(!i||n.has(i))&&(n.add(i),o.push(i),o.length>=10))break}return o.length>0?o:void 0}function Zt(e){return{q:typeof e.q=="string"&&e.q?e.q:void 0,remoteOption:Ke.includes(e.remoteOption)?e.remoteOption:void 0,employmentType:Ye.includes(e.employmentType)?e.employmentType:void 0,seniority:Ze(e.seniority),company:Xe(e.company),sort:We.includes(e.sort)?e.sort:void 0}}var ae={};L(ae,{COUNTRY_CODES:()=>Y,buildJobBreadcrumbs:()=>K,countryOptions:()=>Tt,formatDate:()=>rt,formatMonthYear:()=>st,formatPublishedRelativeDate:()=>it,formatSalaryRange:()=>at,formatSalaryStat:()=>$,formatSalaryStatRange:()=>I,normalizeWebsiteUrl:()=>U,resolveCustomFieldDisplay:()=>xt});function S(e){let t=e.trim();if(!t)return null;try{let o=t.replace(/_/g,"-"),[n]=Intl.getCanonicalLocales(o);if(!n)return null;let[r]=Intl.NumberFormat.supportedLocalesOf([n]);return r??null}catch{return null}}var et=new Map,tt=new Map,ot=new Map,nt=new Map;function Xt(e){let t=et.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"always",style:"short"}),et.set(e,t)),t}function eo(e){let t=tt.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:"auto",style:"short"}),tt.set(e,t)),t}function to(e){let t=ot.get(e);return t||(t=new Intl.DateTimeFormat(e,{dateStyle:"medium",timeZone:"UTC"}),ot.set(e,t)),t}function oo(e){let t=nt.get(e);return t||(t=new Intl.DateTimeFormat(e,{month:"short",year:"numeric",timeZone:"UTC"}),nt.set(e,t)),t}function ee(e,t,o){try{return Xt(o).format(e,t)}catch{return null}}function rt(e,t){if(!t)return null;let o=new Date(t);if(Number.isNaN(o.getTime()))return null;let n=S(e);if(!n)return null;try{return to(n).format(o)}catch{return o.toISOString().split("T")[0]}}function it(e,t,o=Date.now()){if(!t)return null;let n=new Date(t);if(Number.isNaN(n.getTime()))return null;let r=S(e);if(!r)return null;let i=o-n.getTime(),s=Math.abs(i),a=60*1e3,p=60*a,l=24*p,u=7*l,d=30*l,m=365*l;if(s<a)try{return eo(r).format(0,"second")}catch{return ee(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:a}];for(let f of y)if(s>=f.ms){let R=Math.round(s/f.ms),c=i>=0?-R:R;return ee(c,f.unit,r)}let g=Math.round(s/1e3),C=i>=0?-g:g;return ee(C,"second",r)}function st(e,t){if(!t)return null;let n=/^\d{4}-\d{2}(-\d{2})?$/.test(t)?new Date(t.length===7?`${t}-01T00:00:00.000Z`:`${t}T00:00:00.000Z`):new Date(t);if(Number.isNaN(n.getTime()))return null;let r=S(e);if(!r)return null;try{return oo(r).format(n)}catch{return null}}var N=new Map;function te(e,t,o,n="symbol",r="compact"){let i=`${t}:${o}:${n}:${r}`,s=N.get(i);if(s===void 0){try{let a={style:"currency",currency:o,currencyDisplay:n,notation:r};r==="compact"&&(a.compactDisplay="short",a.maximumFractionDigits=1,a.minimumFractionDigits=0),s=new Intl.NumberFormat(t,a)}catch{s=null}N.set(i,s)}return s?s.format(e):null}function no(e,t,o,n,r="symbol",i="compact"){let s=`${o}:${n}:${r}:${i}:range`,a=N.get(s);if(a===void 0){try{let p={style:"currency",currency:n,currencyDisplay:r,notation:i};i==="compact"&&(p.compactDisplay="short",p.maximumFractionDigits=1,p.minimumFractionDigits=0),a=new Intl.NumberFormat(o,p)}catch{a=null}N.set(s,a)}return a?a.formatRange(e,t):null}var ro=new Set(["per_year","per_month","per_week","per_day","per_hour"]);function io(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function at(e,t,o,n,r=null,i="symbol",s){let a=t==null||Number.isFinite(t),p=o==null||Number.isFinite(o);if(!a||!p||t==null&&o==null)return null;let l=r?.trim().toUpperCase()||null;if(!l)return null;let u=S(e);if(!u)return null;let d=s??io(t,o),m=typeof n=="string"&&ro.has(n)?n:null;if(t!=null&&o!=null){let g=t<=o?t:o,C=t<=o?o:t,f=g===C?te(g,u,l,i,d):no(g,C,u,l,i,d);return f?{text:f,timeframe:m,bound:"range"}:null}if(t!=null){let g=te(t,u,l,i,d);return g?{text:g,timeframe:m,bound:"from"}:null}let y=te(o,u,l,i,d);return y?{text:y,timeframe:m,bound:"upTo"}:null}var lt=new Map;function pt(...e){let t=!1;for(let o of e)if(!(o==null||!Number.isFinite(o))&&(t=!0,Math.abs(o)>=1e3))return"compact";return t?"standard":"compact"}function ct(e,t,o){let n=`${e}:${t}:${o}`,r=lt.get(n);if(r!==void 0)return r;let i;try{let s={style:"currency",currency:t,notation:o};o==="compact"&&(s.compactDisplay="short",s.minimumFractionDigits=0,s.maximumFractionDigits=1),i=new Intl.NumberFormat(e,s)}catch{i=null}return lt.set(n,i),i}function $(e,t,o,n){if(!Number.isFinite(t))return null;let r=o?.trim().toUpperCase()||null;if(!r)return null;let i=S(e);if(!i)return null;let s=n??pt(t),a=ct(i,r,s);return a?a.format(t):null}function I(e,t,o,n,r){if(!Number.isFinite(t)||!Number.isFinite(o))return null;let i=n?.trim().toUpperCase()||null;if(!i)return null;let s=S(e);if(!s)return null;let a=r??pt(t,o),p=ct(s,i,a);if(!p)return null;let l=Math.min(t,o),u=Math.max(t,o);return l===u?p.format(l):p.formatRange(l,u)}var D=["entry_level","associate","mid_level","senior","lead","principal","director","executive"];function ut(e){return[...e].sort((t,o)=>{let n=D.indexOf(t.seniority),r=D.indexOf(o.seniority);return(n===-1?999:n)-(r===-1?999:r)})}var so={unitText:"YEAR",duration:"P1Y"};function k(e,t,o,n,r={}){return{"@type":"MonetaryAmountDistribution",...e!==void 0?{name:e}:{},currency:t,minValue:o,maxValue:n,...r,...so}}function oe(e,t,o,n){return e.map(r=>{let i=n?.seniorityName?.({seniority:r.seniority,entity:o});return k(i,t,r.avgSalaryMin,r.avgSalaryMax)})}function j(e,t,o,n){return{"@context":"https://schema.org","@type":e,name:t,...o,estimatedSalary:n}}function mt(e,t,o,n){if(!o)return[];let r=I(e,o.avgMin,o.avgMax,n);return[{kind:"average",label:t,range:r,avgMin:o.avgMin,avgMax:o.avgMax,currency:n,jobCount:o.jobCount},{kind:"methodology",label:t}]}function Q(e){return e.length===0?null:{"@context":"https://schema.org","@type":"ItemList",numberOfItems:e.length,itemListElement:e.map((t,o)=>({"@type":"ListItem",position:o+1,name:t.name,url:t.url}))}}function dt(e){return e.length===0?null:{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(t=>({"@type":"Question",name:t.q,acceptedAnswer:{"@type":"Answer",text:t.a}}))}}function yt(e,t){return e.overallSalary?j("Occupation",e.categoryName,{},[k(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardP25Min?{percentile25:e.boardP25Min}:{},...e.boardP75Max?{percentile75:e.boardP75Max}:{}}),...oe(e.bySeniority,e.currency,e.categoryName,t)]):null}function gt(e){return e.overallSalary?j("Occupation",e.skillName,{},[k(e.skillName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{median:Math.round((e.overallSalary.medianMin+e.overallSalary.medianMax)/2)})]):null}function ft(e,t){return!t?.occupationUrl||!(e.adminLevel==="city"||e.adminLevel==="locality")?null:Q(e.topCategories.map(n=>({name:n.categoryName,url:t.occupationUrl(n)})))}function ht(e,t){return e.overall?j("Occupation",e.name,{occupationLocation:{"@type":"AdministrativeArea",name:e.placeName,address:{"@type":"PostalAddress",addressCountry:e.countryCode}}},[k(e.name,e.currency,e.overall.avgMin,e.overall.avgMax,{...e.overall.p25Min?{percentile25:e.overall.p25Min}:{},...e.overall.p75Max?{percentile75:e.overall.p75Max}:{}}),...oe(e.bySeniority,e.currency,e.name,t)]):null}function bt(e,t){return t?.occupationUrl?Q(e.byCategory.map(o=>({name:o.categoryName,url:t.occupationUrl(o)}))):null}function St(e,t){return e.overallSalary?j("Occupation",e.categoryName,{occupationalCategory:e.categoryName,hiringOrganization:{"@type":"Organization",name:e.companyName}},[k(e.categoryName,e.currency,e.overallSalary.avgMin,e.overallSalary.avgMax,{...e.boardCategoryP25Min?{percentile25:e.boardCategoryP25Min}:{},...e.boardCategoryP75Max?{percentile75:e.boardCategoryP75Max}:{}}),...oe(e.bySeniority,e.currency,e.categoryName,t)]):null}var Ct={high_school:"high school",associate_degree:"associate degree",bachelor_degree:"bachelor degree",professional_certificate:"professional certificate",postgraduate_degree:"postgraduate degree"},ao={full_time:"FULL_TIME",part_time:"PART_TIME",contract:"CONTRACTOR",internship:"INTERN",temporary:"TEMPORARY",volunteer:"VOLUNTEER",other:"OTHER"},lo={per_year:"YEAR",per_month:"MONTH",per_week:"WEEK",per_day:"DAY",per_hour:"HOUR"},re=["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 Et({job:e,board:t,shareUrl:o}){let n=fo(e),r=ho(e),i=ne({"@context":"https://schema.org/","@type":"JobPosting",title:e.title,description:e.description??"",identifier:po(e,t),datePosted:Ot(e.publishedAt),validThrough:Ot(e.expiresAt),employmentType:e.employmentType?ao[e.employmentType]??"OTHER":"OTHER",hiringOrganization:co(e,t),jobLocation:mo(e),jobLocationType:e.remoteOption==="remote"?"TELECOMMUTE":void 0,applicantLocationRequirements:e.remoteOption==="remote"?go(e):null,baseSalary:uo(e),educationRequirements:n,experienceRequirements:r,experienceInPlaceOfEducation:e.experienceInPlaceOfEducation===!0&&n&&r?!0:void 0,url:o});return!i||Array.isArray(i)||Object.keys(i).length===0?null:i}function po(e,t){let o=e.company?.name??t.name??null,n={"@type":"PropertyValue",value:e.id};return o&&(n.name=o),n}function co(e,t){let o=e.company?.name??t.name??null;if(!o)return null;let n={"@type":"Organization",name:o},r=e.company?.website??null,i=r?U(r):null;i&&(n.sameAs=i);let s=e.company?.logoUrl??t.logoUrl??null;return s&&(n.logo=s),n}function U(e){let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function uo(e){let t=e.salaryCurrency?.trim(),o=typeof e.salaryMin=="number",n=typeof e.salaryMax=="number";if(!t||!o&&!n)return null;let r={"@type":"QuantitativeValue"};o&&(r.minValue=e.salaryMin),n&&(r.maxValue=e.salaryMax);let i=e.salaryTimeframe?lo[e.salaryTimeframe]:void 0;return i&&(r.unitText=i),!o&&n&&typeof e.salaryMax=="number"?(r.value=e.salaryMax,r.minValue=e.salaryMax):!n&&o&&typeof e.salaryMin=="number"&&(r.value=e.salaryMin,r.maxValue=e.salaryMin),{"@type":"MonetaryAmount",currency:t.toUpperCase(),value:r}}function mo(e){let t=e.officeLocations.map(o=>yo({countryCode:o.countryCode,region:o.region,locality:o.city??o.locality,postalCode:o.postalCode,name:o.displayName})).filter(o=>o!==null);return t.length===0?null:t.length===1?t[0]:t}function yo({countryCode:e,region:t,locality:o,postalCode:n,name:r}){let i={"@type":"PostalAddress"},s=e?.trim(),a=t?.trim(),p=o?.trim(),l=n?.trim(),u=r?.trim();s&&(i.addressCountry=s.toUpperCase()),a&&(i.addressRegion=a),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 go(e){if(e.remoteWorldwide)return re.map(n=>({"@type":"Country",name:n}));let t=[],o=new Set;for(let n of e.remoteWorkPermitCountryCodes??[]){let r=n?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}for(let n of e.remoteWorkPermitSubdivisionCodes??[]){let r=n?.split("-")[0]?.trim().toUpperCase();!r||o.has(r)||(o.add(r),t.push({"@type":"Country",name:r}))}return t.length===0?null:t.length===1?t[0]:t}function fo(e){let t=e.educationRequirements;if(!t||t.length===0)return null;if(t.includes("no_requirements"))return"no requirements";let o=t.filter(n=>n in Ct).map(n=>({"@type":"EducationalOccupationalCredential",credentialCategory:Ct[n]}));return o.length>0?o:null}function ho(e){let t=e.experienceMonths;return typeof t!="number"?null:t===0?"no requirements":{"@type":"OccupationalExperienceRequirements",monthsOfExperience:t}}function Ot(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function ne(e){let t=o=>o==null?!1:Array.isArray(o)?o.length>0:typeof o=="object"?Object.keys(o).length>0:!0;if(Array.isArray(e))return e.map(o=>ne(o)).filter(t);if(e&&typeof e=="object"){let o=Object.entries(e).map(([n,r])=>[n,ne(r)]).filter(([,n])=>t(n));return Object.fromEntries(o)}return e}var se={};L(se,{BOARD_PATHS:()=>H,blogAuthorPath:()=>Po,blogPostPath:()=>vt,blogTagPath:()=>Lt,boardUrl:()=>V,companyMarketPath:()=>At,companyPath:()=>Bt,companySalaryPath:()=>So,encodePathSegment:()=>h,goAlertsConfirmPath:()=>Ao,goAlertsManagePath:()=>Bo,goJobPath:()=>Ro,jobDetailPath:()=>ie,jobsCategoryPath:()=>q,jobsLocationCategoryPath:()=>G,jobsLocationPath:()=>J,jobsLocationSkillPath:()=>Rt,jobsSkillPath:()=>Pt,salaryLocationPath:()=>Eo,salarySkillPath:()=>Oo,salaryTitlePath:()=>Co,suggestionPath:()=>bo});function h(e){try{return encodeURIComponent(decodeURIComponent(e)).replace(/%3A/gi,":")}catch{return encodeURIComponent(e).replace(/%3A/gi,":")}}function ie(e,t){return`/companies/${h(e)}/jobs/${h(t)}`}function q(e){return`/jobs/${h(e)}`}function Pt(e){return`/jobs/skills/${h(e)}`}function J(e){return`/jobs/locations/${h(e)}`}function G(e,t){return`${J(e)}/${h(t)}`}function Rt(e,t){return`${J(e)}/skills/${h(t)}`}function Bt(e){return`/companies/${h(e)}`}function At(e){return`/companies/markets/${h(e)}`}function bo(e,t){let o=t.location?.trim()||void 0;return t.scope==="blog"?e.type==="post"?vt(e.slug):e.type==="tag"?Lt(e.slug):null:t.scope==="jobs"?e.type==="company"||e.type==="market"||e.type==="post"||e.type==="tag"?null:e.termType==="skill"?o?Rt(o,e.canonicalSlug):Pt(e.canonicalSlug):o?G(o,e.canonicalSlug):q(e.canonicalSlug):e.type==="company"?Bt(e.slug):e.type==="market"?At(e.slug):null}function So(e){return`/companies/${h(e)}/salaries`}function Co(e){return`/salaries/titles/${h(e)}`}function Oo(e){return`/salaries/skills/${h(e)}`}function Eo(e){return`/salaries/locations/${h(e)}`}function vt(e){return`/blog/${h(e)}`}function Lt(e){return`/blog/tag/${h(e)}`}function Po(e){return`/blog/author/${h(e)}`}var H={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 Ro(e){return`/go/job/${e}`}function Bo(){return"/go/alerts-manage"}function Ao(){return"/go/alerts-confirm"}function V(e,t){return`${e.replace(/\/+$/,"")}${t}`}function _t(e,t={}){let o=e.map(r=>{let i=r.label?.trim();return i?{name:i,href:r.href?.trim()??null}:null}).filter(r=>!!r);return o.length<2?null:{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:o.map((r,i)=>{let s=r.href?vo(r.href,t.origin??null):null,a={"@type":"ListItem",position:i+1,name:r.name};return s&&(a.item=s),a})}}function vo(e,t){if(Lo(e))return e;if(!t)return null;let o=e.startsWith("/")?e:`/${e}`;return`${t}${o}`}function Lo(e){return/^https?:\/\//i.test(e)}function K(e){let t=[{kind:"home",path:H.home},{kind:"jobs",path:H.jobs}],o=null;for(let r of e.placeHierarchy)o=r.slug,t.push({kind:"place",name:r.name,path:J(r.slug)});let n=e.categories[0];return n&&t.push({kind:"category",name:n.name,path:o?G(o,n.slug):q(n.slug)}),t.push({kind:"job",name:e.title}),t}var Y=["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 _o(e){try{return new Intl.DisplayNames([e],{type:"region"})}catch{return null}}function To(e){try{return new Intl.Collator(e)}catch{return new Intl.Collator}}function Tt(e){let t=S(e);if(!t)return Y.map(r=>({code:r,name:r})).sort((r,i)=>r.code<i.code?-1:r.code>i.code?1:0);let o=_o(t),n=To(t).compare;return Y.map(r=>({code:r,name:o?.of(r)??r})).sort((r,i)=>n(r.name,i.name))}function xo(e,t){if(!Array.isArray(t)||t.length===0)return null;let o=t.map(n=>e.options?.find(r=>r.key===n)?.label).filter(n=>!!n);return o.length>0?o:null}function Fo(e,t){switch(e.type){case"number":return null;case"multi_select":return null;case"single_select":return typeof t!="string"?null:e.options?.find(o=>o.key===t)?.label??null;default:return typeof t=="string"&&t.trim()!==""?t:null}}function xt(e,t,o){let n=[];for(let r of t??[]){let i=o?.[r.key];if(r.type==="boolean"){typeof i=="boolean"&&n.push({key:r.key,label:r.label,kind:"boolean",value:i});continue}if(r.type==="number"){typeof i=="number"&&Number.isFinite(i)&&n.push({key:r.key,label:r.label,kind:"number",value:i});continue}if(r.type==="multi_select"){let a=xo(r,i);a&&n.push({key:r.key,label:r.label,kind:"multi_select",values:a});continue}let s=Fo(r,i);s!==null&&n.push({key:r.key,label:r.label,kind:"text",value:s})}return n}var le={};L(le,{ALL_COUNTRY_CODES:()=>re,SENIORITY_ORDER:()=>D,buildJobBreadcrumbs:()=>K,buildSalaryFaq:()=>mt,companyCategorySalaryJsonLd:()=>St,companySalaryJsonLd:()=>bt,createAuthorProfileJsonLd:()=>It,createBlogArticleJsonLd:()=>Ft,createBreadcrumbJsonLd:()=>_t,createJobPostingJsonLd:()=>Et,crossAxisSalaryJsonLd:()=>ht,faqJsonLd:()=>dt,formatSalaryStat:()=>$,formatSalaryStatRange:()=>I,itemListJsonLd:()=>Q,listingHead:()=>kt,listingJsonLd:()=>Ut,locationSalaryJsonLd:()=>ft,normalizeWebsiteUrl:()=>U,skillSalaryJsonLd:()=>gt,sortBySeniority:()=>ut,titleSalaryJsonLd:()=>yt});function Ft({post:e,boardName:t,permalink:o,ogImageUrl:n}){let r={"@context":"https://schema.org","@type":"Article",headline:e.title,url:o,mainEntityOfPage:{"@type":"WebPage","@id":o},publisher:{"@type":"Organization",name:t}};e.customExcerpt&&(r.description=e.customExcerpt),e.publishedAt&&(r.datePublished=e.publishedAt);let i=e.coverUrl??n;i&&(r.image=i);let s=e.authors[0];return s&&(r.author={"@type":"Person",name:s.name,...s.websiteUrl?{url:s.websiteUrl}:{}}),r}function It({author:e,canonical:t,description:o,origin:n,posts:r,totalPosts:i}){if(!e.name)return null;let s=o.trim(),a=[z(e.websiteUrl),z(e.twitterUrl),z(e.linkedinUrl),z(e.githubUrl)].filter(m=>!!m),p=`${t}#profile`,l=r.slice(0,5).map(m=>{let y=Io(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:t,mainEntity:{"@type":"Person","@id":p,name:e.name,alternateName:e.slug??void 0,identifier:e.id??void 0,description:s||void 0,image:e.avatarUrl??void 0,sameAs:a.length>0?a:void 0,url:t,mainEntityOfPage:t,agentInteractionStatistic:u}};return l.length>0&&(d.hasPart=l),d}function z(e){if(!e)return null;let t=e.trim();if(!t)return null;try{let o=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;return new URL(o).toString()}catch{return null}}function Io(e,t){if(!e||!t)return null;try{return new URL(t,e).toString()}catch{return null}}function kt(e){let t=e.title,o=e.description,n=`${e.origin}${e.path}`;return{meta:[{title:t},{name:"description",content:o},{property:"og:title",content:t},{property:"og:description",content:o},{property:"og:type",content:"website"},{property:"og:url",content:n}],links:[{rel:"canonical",href:n}]}}function Ut(e){let t=[];e.breadcrumbs.length>=2&&t.push({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.breadcrumbs.map((n,r)=>({"@type":"ListItem",position:r+1,name:n.name,...n.path?{item:V(e.origin,n.path)}:{}}))});let o=(e.jobs??[]).filter(n=>n.company!=null&&!!n.company.slug);return o.length>0&&t.push({"@context":"https://schema.org","@type":"ItemList",itemListElement:o.map((n,r)=>({"@type":"ListItem",position:r+1,url:V(e.origin,ie(n.company.slug,n.slug))}))}),t}var pe={};L(pe,{createSuggestController:()=>Jo});function ko(e){return typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError"}function Uo(e){try{let t=0;for(let o of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e))t+=1;return t}catch{return[...e].length}}function Jt(e,t){return t.size===0?e.slice():e.filter(o=>!(o.type==="company"&&t.has(o.slug.toLowerCase().normalize("NFC"))))}function Jo(e,t){let o=t?.minChars??2,n=t?.debounceMs??250,r=t?.limit,i=!1,s={query:"",items:[],status:"idle",error:null},a=[],p=new Set,l=0,u=null,d=null,m=new Set;function y(){for(let c of m)c()}function g(c){s=c,y()}function C(){u!==null&&(globalThis.clearTimeout(u),u=null)}function f(){d&&(d.abort(),d=null)}function R(c){let b=++l;f();let O=new AbortController;d=O;let v={q:c};r!==void 0&&(v.limit=r),e.search.suggest(v,{signal:O.signal}).then(B=>{i||b!==l||(d=null,a=B.items,g({query:s.query,items:Jt(a,p),status:"ready",error:null}))}).catch(B=>{i||b!==l||ko(B)||(d=null,g({query:s.query,items:s.items,status:"error",error:B}))})}return{setQuery(c){if(i)return;let b=c.trim();if(C(),Uo(b)<o){l+=1,f(),a=[],g({query:c,items:[],status:"idle",error:null});return}l+=1,f(),g({query:c,items:s.items,status:"loading",error:null}),u=globalThis.setTimeout(()=>{u=null,!i&&R(b)},n)},setExcludedCompanySlugs(c){i||(p=new Set(c.map(b=>b.trim().toLowerCase().normalize("NFC")).filter(Boolean)),g({query:s.query,items:Jt(a,p),status:s.status,error:s.error}))},getState(){return s},subscribe(c){return i?()=>{}:(m.add(c),()=>{m.delete(c)})},dispose(){i||(i=!0,C(),f(),l+=1,m.clear())}}}return jt(Mo);})();
package/dist/index.d.mts CHANGED
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.3.1";
145
+ declare const SDK_VERSION = "4.4.1";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
package/dist/index.d.ts CHANGED
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.3.1";
145
+ declare const SDK_VERSION = "4.4.1";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
package/dist/index.js CHANGED
@@ -312,7 +312,7 @@ async function clearSession(storage) {
312
312
  }
313
313
 
314
314
  // src/version.ts
315
- var SDK_VERSION = "4.3.1";
315
+ var SDK_VERSION = "4.4.1";
316
316
 
317
317
  // src/client.ts
318
318
  function isRawBody(body) {
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ function toSearchParams(query) {
39
39
  }
40
40
 
41
41
  // src/version.ts
42
- var SDK_VERSION = "4.3.1";
42
+ var SDK_VERSION = "4.4.1";
43
43
 
44
44
  // src/client.ts
45
45
  function isRawBody(body) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.3.1",
3
+ "version": "4.4.1",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -51,6 +51,8 @@
51
51
  "main": "./dist/index.js",
52
52
  "module": "./dist/index.mjs",
53
53
  "types": "./dist/index.d.ts",
54
+ "unpkg": "./dist/browser/cavuno-board.global.min.js",
55
+ "jsdelivr": "./dist/browser/cavuno-board.global.min.js",
54
56
  "exports": {
55
57
  ".": {
56
58
  "import": {
@@ -203,14 +205,17 @@
203
205
  "clean": "git clean -xdf .turbo dist node_modules src/generated",
204
206
  "typecheck": "tsgo --noEmit && tsgo --noEmit -p tsconfig.node.json",
205
207
  "test": "vitest run",
206
- "check:publish": "publint --strict && attw --pack . --profile node16 && node scripts/check-no-private-kit-types.mjs",
208
+ "test:browser": "node scripts/run-packed-browser-tests.mjs",
209
+ "check:publish": "publint --strict && attw --pack . --profile node16 && node scripts/check-no-private-kit-types.mjs && node scripts/check-browser-global.mjs && node scripts/check-esm-tree-shaking.mjs",
207
210
  "gen:skills-manifest": "tsx scripts/generate-skills-manifest.ts",
208
211
  "assert-publish-target": "node -e \"const p=require('./package.json'); if(p.name!=='@cavuno/board'){throw new Error('Refusing to publish: package.json name is '+p.name+', expected @cavuno/board')}; if(p.private){throw new Error('Refusing to publish: package.json has private:true')}\"",
209
212
  "prepublishOnly": "pnpm run assert-publish-target && pnpm run gen:skills-manifest && pnpm run build"
210
213
  },
211
214
  "devDependencies": {
212
215
  "@arethetypeswrong/cli": "^0.18.2",
216
+ "@playwright/test": "^1.59.1",
213
217
  "@types/node": "24.9.1",
218
+ "esbuild": "^0.27.7",
214
219
  "publint": "^0.3.12",
215
220
  "tsup": "^8.4.0",
216
221
  "tsx": "^4.19.2",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.3.1",
2
+ "version": "4.4.1",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",